From 62ae6ac8691ba092f3894d2076cd1051b520047a Mon Sep 17 00:00:00 2001 From: daole Date: Thu, 27 Aug 2026 14:56:01 +0700 Subject: [PATCH] fix: prevent image decode future from completing twice --- .../cache_managers/image_cache_manager.dart | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/flutter_cache_manager/lib/src/cache_managers/image_cache_manager.dart b/flutter_cache_manager/lib/src/cache_managers/image_cache_manager.dart index e27b07c1..5851a7ab 100644 --- a/flutter_cache_manager/lib/src/cache_managers/image_cache_manager.dart +++ b/flutter_cache_manager/lib/src/cache_managers/image_cache_manager.dart @@ -163,14 +163,27 @@ Future _decodeImage( allowUpscaling: allowUpscaling, ) : fileImage as ImageProvider; + final completer = Completer(); - image - .resolve(ImageConfiguration.empty) - .addListener( - ImageStreamListener((info, _) { - completer.complete(info.image); - image.evict(); - }), - ); + final stream = image.resolve(ImageConfiguration.empty); + + late final ImageStreamListener listener; + listener = ImageStreamListener( + (info, _) { + if (completer.isCompleted) return; + + stream.removeListener(listener); + image.evict(); + completer.complete(info.image); + }, + onError: (Object error, StackTrace? stackTrace) { + if (completer.isCompleted) return; + + stream.removeListener(listener); + completer.completeError(error, stackTrace); + }, + ); + + stream.addListener(listener); return completer.future; }