Skip to content

Commit ad4dea3

Browse files
committed
Close chunk events stream controller when imageStream is disposed
1 parent 3fcd65a commit ad4dea3

File tree

1 file changed

+25
-2
lines changed

1 file changed

+25
-2
lines changed

cached_network_image/lib/src/image_provider/cached_network_image_provider.dart

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ class CachedNetworkImageProvider
7777
ImageStreamCompleter load(
7878
image_provider.CachedNetworkImageProvider key, DecoderCallback decode) {
7979
final chunkEvents = StreamController<ImageChunkEvent>();
80-
return MultiImageStreamCompleter(
80+
final imageStreamCompleter = MultiImageStreamCompleter(
8181
codec: _loadAsync(key, chunkEvents, decode),
8282
chunkEvents: chunkEvents.stream,
8383
scale: key.scale,
@@ -89,6 +89,10 @@ class CachedNetworkImageProvider
8989
);
9090
},
9191
);
92+
93+
_handleChunkEventsClose(imageStreamCompleter, chunkEvents);
94+
95+
return imageStreamCompleter;
9296
}
9397

9498
@Deprecated(
@@ -118,7 +122,7 @@ class CachedNetworkImageProvider
118122
ImageStreamCompleter loadBuffer(image_provider.CachedNetworkImageProvider key,
119123
DecoderBufferCallback decode) {
120124
final chunkEvents = StreamController<ImageChunkEvent>();
121-
return MultiImageStreamCompleter(
125+
final imageStreamCompleter = MultiImageStreamCompleter(
122126
codec: _loadBufferAsync(key, chunkEvents, decode),
123127
chunkEvents: chunkEvents.stream,
124128
scale: key.scale,
@@ -130,6 +134,10 @@ class CachedNetworkImageProvider
130134
);
131135
},
132136
);
137+
138+
_handleChunkEventsClose(imageStreamCompleter, chunkEvents);
139+
140+
return imageStreamCompleter;
133141
}
134142

135143
Stream<ui.Codec> _loadBufferAsync(
@@ -164,6 +172,21 @@ class CachedNetworkImageProvider
164172
return false;
165173
}
166174

175+
void _handleChunkEventsClose(
176+
ImageStreamCompleter imageStreamCompleter,
177+
StreamController<ImageChunkEvent> chunkEvents,
178+
) {
179+
// Make sure to close the chunk events controller after
180+
// the image stream disposes. Otherwise reporting an image chunk
181+
// event could fail beacause the ImageStream has been disposed.
182+
// (https://github.com/Baseflow/flutter_cached_network_image/issues/785)
183+
imageStreamCompleter.addOnLastListenerRemovedCallback(() {
184+
if (!chunkEvents.isClosed) {
185+
chunkEvents.close();
186+
}
187+
});
188+
}
189+
167190
@override
168191
int get hashCode => Object.hash(cacheKey ?? url, scale, maxHeight, maxWidth);
169192

0 commit comments

Comments
 (0)