loadBuffer method

  1. @Deprecated('loadBuffer is deprecated, use loadImage instead')
  2. @override
ImageStreamCompleter loadBuffer(
  1. CachedNetworkImageProvider key,
  2. DecoderBufferCallback decode
)
override

Converts a key into an ImageStreamCompleter, and begins fetching the image.

This method is deprecated. Implement loadImage instead.

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

@Deprecated('loadBuffer is deprecated, use loadImage instead')
@override
ImageStreamCompleter loadBuffer(
  CachedNetworkImageProvider key,
  DecoderBufferCallback decode,
) {
  final chunkEvents = StreamController<ImageChunkEvent>();
  final imageStreamCompleter = MultiImageStreamCompleter(
    codec: _loadBufferAsync(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.loadBuffer fallback to addListener',
          ),
        ),
      );
      imageStreamCompleter.addListener(
        ImageStreamListener(
          (image, synchronousCall) {},
          onError: (Object error, StackTrace? trace) {
            errorListener?.call(error);
          },
        ),
      );
    }
  }

  return imageStreamCompleter;
}