part of 'image_request.dart'; class RemoteImageRequest extends ImageRequest { final String uri; /// Physical size to decode, or null for the source size. final ui.Size? decodeSize; RemoteImageRequest({required this.uri, this.decodeSize}); @override Future load(ImageDecoderCallback decode, {double scale = 1.0}) async { if (_isCancelled) { return null; } final info = await remoteImageApi.requestImage( uri, requestId: requestId, preferEncoded: false, width: decodeSize?.width.ceil(), height: decodeSize?.height.ceil(), ); // Android falls back to encoded data if native decoding fails, so check for both shapes of the response. final frame = switch (info) { {'pointer': final int pointer, 'length': final int length} => await _fromEncodedPlatformImage( pointer, length, decodeSize: decodeSize, ), { 'pointer': final int pointer, 'width': final int width, 'height': final int height, 'rowBytes': final int rowBytes, } => await _fromDecodedPlatformImage(pointer, width, height, rowBytes), _ => null, }; return frame == null ? null : ImageInfo(image: frame.image, scale: scale); } @override Future loadCodec() async { if (_isCancelled) { return null; } final info = await remoteImageApi.requestImage( uri, requestId: requestId, preferEncoded: true, width: null, height: null, ); if (info == null) { return null; } final (codec, _) = await _codecFromEncodedPlatformImage(info['pointer']!, info['length']!) ?? (null, null); return codec; } @override Future _onCancelled() { return remoteImageApi.cancelRequest(requestId); } }