Skip to content

Commit 2cfdb42

Browse files
authored
Merge pull request #319 from fzyzcjy/develop
remove need for package:image to shrink package size
2 parents 1bd161d + a27d444 commit 2cfdb42

File tree

3 files changed

+48
-7
lines changed

3 files changed

+48
-7
lines changed

flutter_cache_manager/lib/src/cache_managers/image_cache_manager.dart

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
import 'dart:async';
12
import 'dart:math';
2-
import 'dart:typed_data';
3+
import 'dart:ui' as ui;
34

5+
import 'package:file/file.dart';
6+
import 'package:flutter/widgets.dart';
47
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
5-
import 'package:image/image.dart';
68

79
const supportedFileNames = ['jpg', 'jpeg', 'png', 'tga', 'gif', 'cur', 'ico'];
810
mixin ImageCacheManager on BaseCacheManager {
@@ -60,6 +62,7 @@ mixin ImageCacheManager on BaseCacheManager {
6062
}
6163

6264
final Map<String, Stream<FileResponse>> _runningResizes = {};
65+
6366
Future<FileInfo> _resizeImageFile(
6467
FileInfo originalFile,
6568
String key,
@@ -72,7 +75,14 @@ mixin ImageCacheManager on BaseCacheManager {
7275
return originalFile;
7376
}
7477

75-
var image = decodeImage(await originalFile.file.readAsBytes())!;
78+
var image = await _decodeImage(originalFile.file);
79+
80+
var shouldResize = maxWidth != null
81+
? image.width > maxWidth
82+
: false || maxHeight != null
83+
? image.height > maxHeight
84+
: false;
85+
if (!shouldResize) return originalFile;
7686
if (maxWidth != null && maxHeight != null) {
7787
var resizeFactorWidth = image.width / maxWidth;
7888
var resizeFactorHeight = image.height / maxHeight;
@@ -82,13 +92,17 @@ mixin ImageCacheManager on BaseCacheManager {
8292
maxHeight = (image.height / resizeFactor).round();
8393
}
8494

85-
var resized = copyResize(image, width: maxWidth, height: maxHeight);
86-
var resizedFile = encodeNamedImage(resized, originalFileName)!;
95+
var resized = await _decodeImage(originalFile.file,
96+
width: maxWidth, height: maxHeight, allowUpscaling: false);
97+
var resizedFile =
98+
(await resized.toByteData(format: ui.ImageByteFormat.png))!
99+
.buffer
100+
.asUint8List();
87101
var maxAge = originalFile.validTill.difference(DateTime.now());
88102

89103
var file = await putFile(
90104
originalFile.originalUrl,
91-
Uint8List.fromList(resizedFile),
105+
resizedFile,
92106
key: key,
93107
maxAge: maxAge,
94108
fileExtension: fileExtension,
@@ -131,3 +145,21 @@ mixin ImageCacheManager on BaseCacheManager {
131145
}
132146
}
133147
}
148+
149+
Future<ui.Image> _decodeImage(File file,
150+
{int? width, int? height, bool allowUpscaling = false}) {
151+
var shouldResize = width != null || height != null;
152+
var fileImage = FileImage(file);
153+
final image = shouldResize
154+
? ResizeImage(fileImage,
155+
width: width, height: height, allowUpscaling: allowUpscaling)
156+
: fileImage as ImageProvider;
157+
final completer = Completer<ui.Image>();
158+
image
159+
.resolve(const ImageConfiguration())
160+
.addListener(ImageStreamListener((info, _) {
161+
completer.complete(info.image);
162+
image.evict();
163+
}));
164+
return completer.future;
165+
}

flutter_cache_manager/pubspec.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ dependencies:
1313
flutter:
1414
sdk: flutter
1515
http: ^0.13.0
16-
image: ^3.0.1
1716
path: ^1.8.0
1817
path_provider: ^2.0.0
1918
pedantic: ^1.10.0

flutter_cache_manager/test/image_cache_manager_test.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import 'dart:io';
22
import 'dart:typed_data';
33
import 'dart:ui';
44

5+
import 'package:flutter/material.dart';
56
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
67
import 'package:flutter_test/flutter_test.dart';
78
import 'cache_manager_test.dart';
@@ -13,6 +14,15 @@ const fileName = 'test.jpg';
1314
const fileUrl = 'baseflow.com/test';
1415
final validTill = DateTime.now().add(const Duration(days: 1));
1516
void main() {
17+
setUp(() {
18+
WidgetsFlutterBinding.ensureInitialized();
19+
});
20+
21+
tearDown(() {
22+
PaintingBinding.instance?.imageCache?.clear();
23+
PaintingBinding.instance?.imageCache?.clearLiveImages();
24+
});
25+
1626
group('Test image resizing', () {
1727
test('Test original image size', () async {
1828
final bytes = await getExampleImage();

0 commit comments

Comments
 (0)