@@ -77,7 +77,7 @@ class CachedNetworkImageProvider
77
77
ImageStreamCompleter load (
78
78
image_provider.CachedNetworkImageProvider key, DecoderCallback decode) {
79
79
final chunkEvents = StreamController <ImageChunkEvent >();
80
- return MultiImageStreamCompleter (
80
+ final imageStreamCompleter = MultiImageStreamCompleter (
81
81
codec: _loadAsync (key, chunkEvents, decode),
82
82
chunkEvents: chunkEvents.stream,
83
83
scale: key.scale,
@@ -89,6 +89,10 @@ class CachedNetworkImageProvider
89
89
);
90
90
},
91
91
);
92
+
93
+ _handleChunkEventsClose (imageStreamCompleter, chunkEvents);
94
+
95
+ return imageStreamCompleter;
92
96
}
93
97
94
98
@Deprecated (
@@ -118,7 +122,7 @@ class CachedNetworkImageProvider
118
122
ImageStreamCompleter loadBuffer (image_provider.CachedNetworkImageProvider key,
119
123
DecoderBufferCallback decode) {
120
124
final chunkEvents = StreamController <ImageChunkEvent >();
121
- return MultiImageStreamCompleter (
125
+ final imageStreamCompleter = MultiImageStreamCompleter (
122
126
codec: _loadBufferAsync (key, chunkEvents, decode),
123
127
chunkEvents: chunkEvents.stream,
124
128
scale: key.scale,
@@ -130,6 +134,10 @@ class CachedNetworkImageProvider
130
134
);
131
135
},
132
136
);
137
+
138
+ _handleChunkEventsClose (imageStreamCompleter, chunkEvents);
139
+
140
+ return imageStreamCompleter;
133
141
}
134
142
135
143
Stream <ui.Codec > _loadBufferAsync (
@@ -164,6 +172,21 @@ class CachedNetworkImageProvider
164
172
return false ;
165
173
}
166
174
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
+
167
190
@override
168
191
int get hashCode => Object .hash (cacheKey ?? url, scale, maxHeight, maxWidth);
169
192
0 commit comments