Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -93,3 +93,5 @@ flutter_export_environment.sh
!**/ios/**/default.perspectivev3
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
example/.flutter-plugins-dependencies
cached_network_image/example/.flutter-plugins-dependencies
cached_network_image/example/lib/generated_plugin_registrant.dart
7 changes: 5 additions & 2 deletions CHANGELOG.md → cached_network_image/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
## [3.0.0] - 2020-03-27
## [3.1.0] - 2021-07-16
* Separate Web and IO implementations

## [3.0.0] - 2021-03-27
* Migrate to null safety
* Fix "Cannot clone a disposed image" error
* Update dependencies.

## [3.0.0-nullsafety] - 2020-01-02
## [3.0.0-nullsafety] - 2021-01-02
* Migrate to null safety

## [2.5.0] - 2020-12-22
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,9 @@ class BasicContent extends StatelessWidget {
),
_sizedContainer(
CachedNetworkImage(
progressIndicatorBuilder: (context, url, progress) =>
Center(
child: CircularProgressIndicator(
value: progress.progress,
progressIndicatorBuilder: (context, url, progress) => Center(
child: CircularProgressIndicator(
value: progress.progress,
),
),
imageUrl:
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:cached_network_image_platform_interface/cached_network_image_platform_interface.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
Expand Down Expand Up @@ -227,7 +228,8 @@ class CachedNetworkImage extends StatelessWidget {
this.cacheKey,
this.maxWidthDiskCache,
this.maxHeightDiskCache,
ImageRenderMethodForWeb? imageRenderMethodForWeb,
ImageRenderMethodForWeb imageRenderMethodForWeb =
ImageRenderMethodForWeb.HtmlImage,
}) : _image = CachedNetworkImageProvider(
imageUrl,
headers: httpHeaders,
Expand Down
76 changes: 76 additions & 0 deletions cached_network_image/lib/src/image_provider/_image_loader.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import 'dart:async';
import 'dart:ui' as ui;

import 'package:cached_network_image_platform_interface/cached_network_image_platform_interface.dart';
import 'package:flutter/material.dart';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';

import 'package:cached_network_image_platform_interface'
'/cached_network_image_platform_interface.dart' as platform
show ImageLoader;
import 'package:cached_network_image_platform_interface'
'/cached_network_image_platform_interface.dart'
show ImageRenderMethodForWeb;

class ImageLoader implements platform.ImageLoader {
@override
Stream<ui.Codec> loadAsync(
String url,
String? cacheKey,
StreamController<ImageChunkEvent> chunkEvents,
DecoderCallback decode,
BaseCacheManager cacheManager,
int? maxHeight,
int? maxWidth,
Map<String, String>? headers,
Function()? errorListener,
ImageRenderMethodForWeb imageRenderMethodForWeb,
Function() evictImage,
) async* {
try {
assert(
cacheManager is ImageCacheManager ||
(maxWidth == null && maxHeight == null),
'To resize the image with a CacheManager the '
'CacheManager needs to be an ImageCacheManager. maxWidth and '
'maxHeight will be ignored when a normal CacheManager is used.');

var stream = cacheManager is ImageCacheManager
? cacheManager.getImageFile(url,
maxHeight: maxHeight,
maxWidth: maxWidth,
withProgress: true,
headers: headers,
key: cacheKey)
: cacheManager.getFileStream(url,
withProgress: true, headers: headers, key: cacheKey);

await for (var result in stream) {
if (result is DownloadProgress) {
chunkEvents.add(ImageChunkEvent(
cumulativeBytesLoaded: result.downloaded,
expectedTotalBytes: result.totalSize,
));
}
if (result is FileInfo) {
var file = result.file;
var bytes = await file.readAsBytes();
var decoded = await decode(bytes);
yield decoded;
}
}
} catch (e) {
// Depending on where the exception was thrown, the image cache may not
// have had a chance to track the key in the cache at all.
// Schedule a microtask to give the cache a chance to add the key.
scheduleMicrotask(() {
evictImage();
});

errorListener?.call();
rethrow;
} finally {
await chunkEvents.close();
}
}
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,27 @@
import 'dart:async' show Future, StreamController, scheduleMicrotask;
import 'dart:async' show Future, StreamController;
import 'dart:ui' as ui show Codec;

import 'package:cached_network_image/src/image_provider/multi_image_stream_completer.dart';
import 'package:cached_network_image_platform_interface/cached_network_image_platform_interface.dart'
show ImageRenderMethodForWeb;
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';

import '../../cached_network_image.dart' show ImageRenderMethodForWeb;
import 'cached_network_image_provider.dart' as image_provider;
import 'multi_image_stream_completer.dart';

import 'package:cached_network_image_platform_interface/cached_network_image_platform_interface.dart'
if (dart.library.io) '_image_loader.dart'
if (dart.library.html) 'package:cached_network_image_web/cached_network_image_web.dart'
show ImageLoader;

/// Function which is called after loading the image failed.
typedef ErrorListener = void Function();

/// IO implementation of the CachedNetworkImageProvider; the ImageProvider to
/// load network images using a cache.
class CachedNetworkImageProvider
extends ImageProvider<image_provider.CachedNetworkImageProvider>
implements image_provider.CachedNetworkImageProvider {
extends ImageProvider<image_provider.CachedNetworkImageProvider> {
/// Creates an ImageProvider which loads an image from the [url], using the [scale].
/// When the image fails to load [errorListener] is called.
const CachedNetworkImageProvider(
Expand All @@ -25,39 +33,32 @@ class CachedNetworkImageProvider
this.headers,
this.cacheManager,
this.cacheKey,
//ignore: avoid_unused_constructor_parameters
ImageRenderMethodForWeb? imageRenderMethodForWeb,
this.imageRenderMethodForWeb = ImageRenderMethodForWeb.HtmlImage,
});

@override
final BaseCacheManager? cacheManager;

/// Web url of the image to load
@override
final String url;

/// Cache key of the image to cache
@override
final String? cacheKey;

/// Scale of the image
@override
final double scale;

/// Listener to be called when images fails to load.
@override
final image_provider.ErrorListener? errorListener;

/// Set headers for the image provider, for example for authentication
@override
final Map<String, String>? headers;

@override
final int? maxHeight;

@override
final int? maxWidth;

final ImageRenderMethodForWeb imageRenderMethodForWeb;

@override
Future<CachedNetworkImageProvider> obtainKey(
ImageConfiguration configuration) {
Expand Down Expand Up @@ -86,53 +87,21 @@ class CachedNetworkImageProvider
image_provider.CachedNetworkImageProvider key,
StreamController<ImageChunkEvent> chunkEvents,
DecoderCallback decode,
) async* {
) {
assert(key == this);
try {
var mngr = cacheManager ?? DefaultCacheManager();
assert(
mngr is ImageCacheManager || (maxWidth == null && maxHeight == null),
'To resize the image with a CacheManager the '
'CacheManager needs to be an ImageCacheManager. maxWidth and '
'maxHeight will be ignored when a normal CacheManager is used.');

var stream = mngr is ImageCacheManager
? mngr.getImageFile(key.url,
maxHeight: maxHeight,
maxWidth: maxWidth,
withProgress: true,
headers: headers,
key: key.cacheKey)
: mngr.getFileStream(key.url,
withProgress: true, headers: headers, key: key.cacheKey);

await for (var result in stream) {
if (result is DownloadProgress) {
chunkEvents.add(ImageChunkEvent(
cumulativeBytesLoaded: result.downloaded,
expectedTotalBytes: result.totalSize,
));
}
if (result is FileInfo) {
var file = result.file;
var bytes = await file.readAsBytes();
var decoded = await decode(bytes);
yield decoded;
}
}
} catch (e) {
// Depending on where the exception was thrown, the image cache may not
// have had a chance to track the key in the cache at all.
// Schedule a microtask to give the cache a chance to add the key.
scheduleMicrotask(() {
PaintingBinding.instance?.imageCache?.evict(key);
});

errorListener?.call();
rethrow;
} finally {
await chunkEvents.close();
}
return ImageLoader().loadAsync(
url,
cacheKey,
chunkEvents,
decode,
cacheManager ?? DefaultCacheManager(),
maxHeight,
maxWidth,
headers,
errorListener,
imageRenderMethodForWeb,
() => PaintingBinding.instance?.imageCache?.evict(key),
);
}

@override
Expand Down
5 changes: 4 additions & 1 deletion pubspec.yaml → cached_network_image/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@ name: cached_network_image
description: Flutter library to load and cache network images.
Can also be used with placeholder and error widgets.
homepage: https://github.com/Baseflow/flutter_cached_network_image
version: 3.0.0
version: 3.1.0

dependencies:
flutter:
sdk: flutter
flutter_cache_manager: ^3.0.0
octo_image: ^1.0.0
cached_network_image_platform_interface: ^1.0.0-alpha.0
cached_network_image_web: ^1.0.0-alpha.0


dev_dependencies:
flutter_test:
Expand Down
File renamed without changes.
74 changes: 74 additions & 0 deletions cached_network_image_platform_interface/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/

# IntelliJ related
*.iml
*.ipr
*.iws
.idea/

# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/

# Flutter/Dart/Pub related
**/doc/api/
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
.packages
.pub-cache/
.pub/
build/

# Android related
**/android/**/gradle-wrapper.jar
**/android/.gradle
**/android/captures/
**/android/gradlew
**/android/gradlew.bat
**/android/local.properties
**/android/**/GeneratedPluginRegistrant.java

# iOS/XCode related
**/ios/**/*.mode1v3
**/ios/**/*.mode2v3
**/ios/**/*.moved-aside
**/ios/**/*.pbxuser
**/ios/**/*.perspectivev3
**/ios/**/*sync/
**/ios/**/.sconsign.dblite
**/ios/**/.tags*
**/ios/**/.vagrant/
**/ios/**/DerivedData/
**/ios/**/Icon?
**/ios/**/Pods/
**/ios/**/.symlinks/
**/ios/**/profile
**/ios/**/xcuserdata
**/ios/.generated/
**/ios/Flutter/App.framework
**/ios/Flutter/Flutter.framework
**/ios/Flutter/Flutter.podspec
**/ios/Flutter/Generated.xcconfig
**/ios/Flutter/app.flx
**/ios/Flutter/app.zip
**/ios/Flutter/flutter_assets/
**/ios/Flutter/flutter_export_environment.sh
**/ios/ServiceDefinitions.json
**/ios/Runner/GeneratedPluginRegistrant.*

# Exceptions to above rules.
!**/ios/**/default.mode1v3
!**/ios/**/default.mode2v3
!**/ios/**/default.pbxuser
!**/ios/**/default.perspectivev3
10 changes: 10 additions & 0 deletions cached_network_image_platform_interface/.metadata
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.

version:
revision: 1d9032c7e1d867f071f2277eb1673e8f9b0274e3
channel: stable

project_type: package
2 changes: 2 additions & 0 deletions cached_network_image_platform_interface/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
## [1.0.0] - 2021-07-16
* Initial release
Loading