Skip to content

Commit 4a9a1dd

Browse files
committed
✨ Add previewThumbSize for the viewer.
1 parent c1cd6e1 commit 4a9a1dd

File tree

4 files changed

+59
-10
lines changed

4 files changed

+59
-10
lines changed

lib/src/provider/asset_entity_image_provider.dart

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,21 @@ import 'package:photo_manager/photo_manager.dart';
1111

1212
@immutable
1313
class AssetEntityImageProvider extends ImageProvider<AssetEntityImageProvider> {
14-
const AssetEntityImageProvider(
14+
AssetEntityImageProvider(
1515
this.entity, {
1616
this.scale = 1.0,
17-
this.thumbSize = 200,
17+
this.thumbSize = const <int>[200, 200],
1818
this.isOriginal = true,
19-
});
19+
}) : assert(
20+
thumbSize?.length == 2,
21+
'thumbSize must contain and only contain two integers',
22+
) {
23+
if (thumbSize?.length != 2) {
24+
throw ArgumentError(
25+
'thumbSize must contain and only contain two integers',
26+
);
27+
}
28+
}
2029

2130
final AssetEntity entity;
2231

@@ -26,7 +35,7 @@ class AssetEntityImageProvider extends ImageProvider<AssetEntityImageProvider> {
2635

2736
/// Size for thumb data.
2837
/// 缩略图的大小
29-
final int thumbSize;
38+
final List<int> thumbSize;
3039

3140
/// Choose if original data or thumb data should be loaded.
3241
/// 选择载入原数据还是缩略图数据
@@ -71,7 +80,7 @@ class AssetEntityImageProvider extends ImageProvider<AssetEntityImageProvider> {
7180
data = await key.entity.originBytes;
7281
}
7382
} else {
74-
data = await key.entity.thumbDataWithSize(thumbSize, thumbSize);
83+
data = await key.entity.thumbDataWithSize(thumbSize[0], thumbSize[1]);
7584
}
7685
return decode(data);
7786
}

lib/src/widget/asset_picker.dart

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,11 @@ class AssetPicker extends StatelessWidget {
2424
AssetPicker({
2525
Key key,
2626
@required this.provider,
27-
this.pickerTheme,
2827
int gridCount = 4,
2928
Color themeColor,
3029
AssetsPickerTextDelegate textDelegate,
30+
this.pickerTheme,
31+
this.previewThumbSize,
3132
this.specialPickerType,
3233
this.customItemPosition = CustomItemPosition.none,
3334
this.customItemBuilder,
@@ -61,11 +62,25 @@ class AssetPicker extends StatelessWidget {
6162
/// Theme for the picker.
6263
/// 选择器的主题
6364
///
64-
/// Usually the WeChat uses the dark version (dark background color) for the picker.
65-
/// However, some developer wants a light theme version for some reasons.
65+
/// Usually the WeChat uses the dark version (dark background color)
66+
/// for the picker. However, some others want a light or a custom version.
67+
///
6668
/// 通常情况下微信选择器使用的是暗色(暗色背景)的主题,但某些情况下开发者需要亮色或自定义主题。
6769
final ThemeData pickerTheme;
6870

71+
/// Thumb size for the preview of images in the viewer.
72+
/// 预览时图片的缩略图大小
73+
///
74+
/// This only works on images since other types does not have request
75+
/// for thumb data. The speed of preview can be raised by reducing it.
76+
///
77+
/// 该参数仅生效于图片类型的资源,因为其他资源不需要请求缩略图数据。
78+
/// 预览图片的速度可以通过适当降低它的数值来提升。
79+
///
80+
/// Default is `null`, which will request the origin data.
81+
/// 默认为空,即读取原图。
82+
final List<int> previewThumbSize;
83+
6984
/// The current special picker type for the picker.
7085
/// 当前特殊选择类型
7186
///
@@ -93,6 +108,7 @@ class AssetPicker extends StatelessWidget {
93108
int pageSize = 320,
94109
int pathThumbSize = 200,
95110
int gridCount = 4,
111+
List<int> previewThumbSize,
96112
RequestType requestType,
97113
SpecialPickerType specialPickerType,
98114
List<AssetEntity> selectedAssets,
@@ -159,6 +175,7 @@ class AssetPicker extends StatelessWidget {
159175
textDelegate: textDelegate,
160176
themeColor: themeColor,
161177
pickerTheme: pickerTheme,
178+
previewThumbSize: previewThumbSize,
162179
specialPickerType: specialPickerType,
163180
customItemPosition: customItemPosition,
164181
customItemBuilder: customItemBuilder,
@@ -383,6 +400,7 @@ class AssetPicker extends StatelessWidget {
383400
/// The reason that the `thumbData` should be checked at here to see if it is
384401
/// null is that even the image file is not exist, the `File` can still
385402
/// returned as it exist, which will cause the thumb bytes return null.
403+
///
386404
/// 此处需要检查缩略图为空的原因是:尽管文件可能已经被删除,但通过`File`读取的文件对象
387405
/// 仍然存在,使得返回的数据为空。
388406
final Uint8List thumbData = pathEntityList[pathEntity];
@@ -587,6 +605,7 @@ class AssetPicker extends StatelessWidget {
587605
/// 确认按钮
588606
///
589607
/// It'll pop with [AssetPickerProvider.selectedAssets] when there're any assets chosen.
608+
///
590609
/// 当有资源已选时,点击按钮将把已选资源通过路由返回。
591610
Widget confirmButton(BuildContext context) => Consumer<AssetPickerProvider>(
592611
builder: (BuildContext _, AssetPickerProvider provider, Widget __) {
@@ -702,6 +721,7 @@ class AssetPicker extends StatelessWidget {
702721
/// Videos often contains various of color in the cover,
703722
/// so in order to keep the content visible in most cases,
704723
/// the color of the indicator has been set to [Colors.white].
724+
///
705725
/// 视频封面通常包含各种颜色,为了保证内容在一般情况下可见,此处
706726
/// 将指示器的图标和文字设置为 [Colors.white]
707727
Widget videoIndicator(AssetEntity asset) {
@@ -769,6 +789,7 @@ class AssetPicker extends StatelessWidget {
769789
currentIndex: index,
770790
assets: provider.currentAssets,
771791
themeData: theme,
792+
previewThumbSize: previewThumbSize,
772793
specialPickerType:
773794
asset.type == AssetType.video ? specialPickerType : null,
774795
);
@@ -1129,6 +1150,7 @@ class AssetPicker extends StatelessWidget {
11291150
context,
11301151
currentIndex: 0,
11311152
assets: provider.selectedAssets,
1153+
previewThumbSize: previewThumbSize,
11321154
selectedAssets: provider.selectedAssets,
11331155
selectorProvider: provider,
11341156
themeData: theme,

lib/src/widget/asset_picker_viewer.dart

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class AssetPickerViewer extends StatefulWidget {
2828
@required this.currentIndex,
2929
@required this.assets,
3030
@required this.themeData,
31+
this.previewThumbSize,
3132
this.selectedAssets,
3233
this.selectorProvider,
3334
this.specialPickerType,
@@ -53,6 +54,10 @@ class AssetPickerViewer extends StatefulWidget {
5354
/// 主题
5455
final ThemeData themeData;
5556

57+
/// Thumb size for the preview of images in the viewer.
58+
/// 预览时图片的缩略图大小
59+
final List<int> previewThumbSize;
60+
5661
/// The current special picker type for the viewer.
5762
/// 当前特殊选择类型
5863
///
@@ -70,6 +75,7 @@ class AssetPickerViewer extends StatefulWidget {
7075
int currentIndex = 0,
7176
@required List<AssetEntity> assets,
7277
@required ThemeData themeData,
78+
List<int> previewThumbSize,
7379
List<AssetEntity> selectedAssets,
7480
AssetPickerProvider selectorProvider,
7581
SpecialPickerType specialPickerType,
@@ -79,6 +85,7 @@ class AssetPickerViewer extends StatefulWidget {
7985
currentIndex: currentIndex,
8086
assets: assets,
8187
themeData: themeData,
88+
previewThumbSize: previewThumbSize,
8289
selectedAssets: selectedAssets,
8390
selectorProvider: selectorProvider,
8491
specialPickerType: specialPickerType,
@@ -247,7 +254,11 @@ class AssetPickerViewerState extends State<AssetPickerViewer>
247254
builder = AudioPageBuilder(asset: asset, state: this);
248255
break;
249256
case AssetType.image:
250-
builder = ImagePageBuilder(asset: asset, state: this);
257+
builder = ImagePageBuilder(
258+
asset: asset,
259+
state: this,
260+
previewThumbSize: widget.previewThumbSize,
261+
);
251262
break;
252263
case AssetType.video:
253264
builder = VideoPageBuilder(asset: asset, state: this);

lib/src/widget/builder/image_page_builder.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class ImagePageBuilder extends StatelessWidget {
1111
Key key,
1212
this.asset,
1313
this.state,
14+
this.previewThumbSize,
1415
}) : super(key: key);
1516

1617
/// Asset currently displayed.
@@ -21,13 +22,19 @@ class ImagePageBuilder extends StatelessWidget {
2122
/// 资源查看器的状态[State]
2223
final AssetPickerViewerState state;
2324

25+
final List<int> previewThumbSize;
26+
2427
@override
2528
Widget build(BuildContext context) {
2629
return GestureDetector(
2730
behavior: HitTestBehavior.opaque,
2831
onTap: state.switchDisplayingDetail,
2932
child: ExtendedImage(
30-
image: AssetEntityImageProvider(asset),
33+
image: AssetEntityImageProvider(
34+
asset,
35+
isOriginal: previewThumbSize == null,
36+
thumbSize: previewThumbSize,
37+
),
3138
fit: BoxFit.contain,
3239
mode: ExtendedImageMode.gesture,
3340
onDoubleTap: state.updateAnimation,

0 commit comments

Comments
 (0)