loadImage method
ImageStreamCompleter
loadImage(
- CachedNetworkImageProvider key,
- ImageDecoderCallback decode
override
Converts a key into an ImageStreamCompleter, and begins fetching the image.
For backwards-compatibility the default implementation of this method returns an object that will cause resolveStreamForKey to consult loadBuffer. However, implementors of this interface should only override this method and not loadBuffer, which is deprecated.
The decode callback provides the logic to obtain the codec for the
image.
See also:
- ResizeImage, for modifying the key to account for cache dimensions.
Implementation
@override
ImageStreamCompleter loadImage(
CachedNetworkImageProvider key,
ImageDecoderCallback decode,
) {
final chunkEvents = StreamController<ImageChunkEvent>();
final imageStreamCompleter = MultiImageStreamCompleter(
codec: _loadImageAsync(key, chunkEvents, decode),
chunkEvents: chunkEvents.stream,
scale: key.scale,
informationCollector: () => <DiagnosticsNode>[
DiagnosticsProperty<ImageProvider>('Image provider', this),
DiagnosticsProperty<CachedNetworkImageProvider>('Image key', key),
],
);
if (errorListener != null) {
// In Flutter >= 3.16, we use addEphemeralErrorListener to avoid memory leaks.
// addListener keeps the ImageStreamCompleter alive, which prevents disposal
// when there are no other active listeners.
try {
(imageStreamCompleter as dynamic).addEphemeralErrorListener(
(Object error, StackTrace? trace) {
errorListener?.call(error);
},
);
} on NoSuchMethodError {
FlutterError.reportError(
FlutterErrorDetails(
exception:
'Warning: Using errorListener with Flutter < 3.16 causes memory leaks. '
'Please upgrade Flutter or avoid using errorListener.',
library: 'cached_network_image',
context: ErrorDescription(
'CachedNetworkImageProvider.loadImage fallback to addListener',
),
),
);
imageStreamCompleter.addListener(
ImageStreamListener(
(image, synchronousCall) {},
onError: (Object error, StackTrace? trace) {
errorListener?.call(error);
},
),
);
}
}
return imageStreamCompleter;
}