diff --git a/CHANGELOG.md b/CHANGELOG.md index 564d186..5abb287 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## 5.0.1 +* network_image_io: [ExtendedNetworkImageProvider] use bytesLoader to custom bytes loader + ## 5.0.0 * Migrate to 3.29.0 diff --git a/lib/src/network/extended_network_image_provider.dart b/lib/src/network/extended_network_image_provider.dart index 97517d6..afa8d80 100644 --- a/lib/src/network/extended_network_image_provider.dart +++ b/lib/src/network/extended_network_image_provider.dart @@ -29,6 +29,8 @@ abstract class ExtendedNetworkImageProvider String? imageCacheName, Duration? cacheMaxAge, WebHtmlElementStrategy webHtmlElementStrategy, + FutureOr Function(void Function(ImageChunkEvent) chunkEvent)? + bytesLoader, }) = network_image.ExtendedNetworkImageProvider; /// Time Limit to request image @@ -76,6 +78,9 @@ abstract class ExtendedNetworkImageProvider /// Has no effect on other platforms, which always fetch bytes. WebHtmlElementStrategy get webHtmlElementStrategy; + FutureOr Function(void Function(ImageChunkEvent chunkEvent))? + get bytesLoader; + ///get network image data from cached Future getNetworkImageData({ StreamController? chunkEvents, diff --git a/lib/src/network/network_image_io.dart b/lib/src/network/network_image_io.dart index 6ace8ac..f8a8c97 100644 --- a/lib/src/network/network_image_io.dart +++ b/lib/src/network/network_image_io.dart @@ -33,6 +33,7 @@ class ExtendedNetworkImageProvider this.imageCacheName, this.cacheMaxAge, this.webHtmlElementStrategy = WebHtmlElementStrategy.never, + this.bytesLoader, }); /// The name of [ImageCache], you can define custom [ImageCache] to store this provider. @@ -94,6 +95,10 @@ class ExtendedNetworkImageProvider @override final WebHtmlElementStrategy webHtmlElementStrategy; + @override + final FutureOr Function(void Function(ImageChunkEvent chunkEvent))? + bytesLoader; + @override ImageStreamCompleter loadImage( image_provider.ExtendedNetworkImageProvider key, @@ -188,18 +193,18 @@ class ExtendedNetworkImageProvider Uint8List? data; // exist, try to find cache image file if (_cacheImagesDirectory.existsSync()) { - final File cacheFlie = File(join(_cacheImagesDirectory.path, md5Key)); - if (cacheFlie.existsSync()) { + final File cacheFile = File(join(_cacheImagesDirectory.path, md5Key)); + if (cacheFile.existsSync()) { if (key.cacheMaxAge != null) { final DateTime now = DateTime.now(); - final FileStat fs = cacheFlie.statSync(); + final FileStat fs = cacheFile.statSync(); if (now.subtract(key.cacheMaxAge!).isAfter(fs.changed)) { - cacheFlie.deleteSync(recursive: true); + cacheFile.deleteSync(recursive: true); } else { - data = await cacheFlie.readAsBytes(); + data = await cacheFile.readAsBytes(); } } else { - data = await cacheFlie.readAsBytes(); + data = await cacheFile.readAsBytes(); } } } @@ -226,31 +231,41 @@ class ExtendedNetworkImageProvider ) async { try { final Uri resolved = Uri.base.resolve(key.url); - final HttpClientResponse? response = await _tryGetResponse(resolved); - if (response == null || response.statusCode != HttpStatus.ok) { - if (response != null) { - // The network may be only temporarily unavailable, or the file will be - // added on the server later. Avoid having future calls to resolve - // fail to check the network again. - await response.drain>([]); + + final Uint8List bytes; + + if (bytesLoader != null) { + bytes = await bytesLoader!((ImageChunkEvent event) { + chunkEvents?.add(event); + }); + } else { + final HttpClientResponse? response = await _tryGetResponse(resolved); + if (response == null || response.statusCode != HttpStatus.ok) { + if (response != null) { + // The network may be only temporarily unavailable, or the file will be + // added on the server later. Avoid having future calls to resolve + // fail to check the network again. + await response.drain>([]); + } + return null; } - return null; + + bytes = await consolidateHttpClientResponseBytes( + response, + onBytesReceived: + chunkEvents != null + ? (int cumulative, int? total) { + chunkEvents.add( + ImageChunkEvent( + cumulativeBytesLoaded: cumulative, + expectedTotalBytes: total, + ), + ); + } + : null, + ); } - final Uint8List bytes = await consolidateHttpClientResponseBytes( - response, - onBytesReceived: - chunkEvents != null - ? (int cumulative, int? total) { - chunkEvents.add( - ImageChunkEvent( - cumulativeBytesLoaded: cumulative, - expectedTotalBytes: total, - ), - ); - } - : null, - ); if (bytes.lengthInBytes == 0) { return Future.error( StateError('NetworkImage is an empty file: $resolved'), diff --git a/lib/src/network/network_image_web.dart b/lib/src/network/network_image_web.dart index 7bcdd70..ee8f730 100644 --- a/lib/src/network/network_image_web.dart +++ b/lib/src/network/network_image_web.dart @@ -16,6 +16,7 @@ import 'package:flutter/rendering.dart'; import 'package:http_client_helper/http_client_helper.dart'; import 'package:web/web.dart' as web; import 'extended_network_image_provider.dart' as extended_image_provider; + // ignore: directives_ordering import 'package:flutter/src/painting/image_provider.dart' as image_provider; @@ -90,6 +91,7 @@ class ExtendedNetworkImageProvider this.imageCacheName, this.cacheMaxAge, this.webHtmlElementStrategy = WebHtmlElementStrategy.never, + this.bytesLoader, }); @override @@ -138,6 +140,10 @@ class ExtendedNetworkImageProvider @override final WebHtmlElementStrategy webHtmlElementStrategy; + @override + final FutureOr Function(void Function(ImageChunkEvent chunkEvent))? + bytesLoader; + @override Future obtainKey( ImageConfiguration configuration, diff --git a/pubspec.yaml b/pubspec.yaml index 22fe390..ebd6219 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: extended_image_library description: Library that contains common base class for `extended_image`, `extended_text`, and `extended_text_field`. repository: https://github.com/fluttercandies/extended_image_library -version: 5.0.0 +version: 5.0.1 environment: sdk: ^3.7.0