Skip to content

Commit 21e22a6

Browse files
🐛 Make sure no more than maxAssets are selected by the asset picker viewer (#118)
Co-authored-by: Alex Li <[email protected]>
1 parent cacb7b9 commit 21e22a6

File tree

5 files changed

+54
-38
lines changed

5 files changed

+54
-38
lines changed

example/lib/pages/custom_picker_page.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1066,6 +1066,7 @@ class FileAssetPickerViewerBuilderDelegate
10661066
currentIndex: currentIndex,
10671067
selectedAssets: selectedAssets,
10681068
selectorProvider: selectorProvider,
1069+
maxAssets: selectorProvider?.maxAssets,
10691070
);
10701071

10711072
bool isDisplayingDetail = true;

lib/src/constants/enums.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
/// Provide some special picker types to integrate
77
/// un-common pick pattern.
88
/// 提供一些特殊的选择器类型以整合非常规的选择行为。
9-
enum SpecialPickerType {
9+
enum SpecialPickerType {
1010
/// WeChat Moments mode.
1111
/// 微信朋友圈模式
1212
///

lib/src/delegates/asset_picker_builder_delegate.dart

Lines changed: 40 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1117,39 +1117,41 @@ class DefaultAssetPickerBuilderDelegate
11171117
Widget previewButton(BuildContext context) {
11181118
return Selector<DefaultAssetPickerProvider, bool>(
11191119
selector: (_, DefaultAssetPickerProvider p) => p.isSelectedNotEmpty,
1120-
builder: (_, bool isSelectedNotEmpty, __) => GestureDetector(
1121-
onTap: isSelectedNotEmpty
1122-
? () async {
1123-
final List<AssetEntity> _selected;
1124-
if (isWeChatMoment) {
1125-
_selected = provider.selectedAssets
1126-
.where((AssetEntity e) => e.type == AssetType.image)
1127-
.toList();
1128-
} else {
1129-
_selected = provider.selectedAssets;
1130-
}
1131-
final List<AssetEntity>? result =
1132-
await AssetPickerViewer.pushToViewer(
1133-
context,
1134-
currentIndex: 0,
1135-
previewAssets: _selected,
1136-
previewThumbSize: previewThumbSize,
1137-
selectedAssets: _selected,
1138-
selectorProvider: provider as DefaultAssetPickerProvider,
1139-
themeData: theme,
1140-
);
1141-
if (result != null) {
1142-
Navigator.of(context).pop(result);
1143-
}
1144-
}
1145-
: null,
1146-
child: Padding(
1147-
padding: const EdgeInsets.symmetric(vertical: 12.0),
1148-
child: Selector<DefaultAssetPickerProvider, List<AssetEntity>>(
1149-
selector: (_, DefaultAssetPickerProvider provider) =>
1150-
provider.selectedAssets,
1151-
builder: (_, List<AssetEntity> selectedAssets, __) {
1152-
return Text(
1120+
builder: (BuildContext c, bool isSelectedNotEmpty, Widget? child) {
1121+
return GestureDetector(
1122+
onTap: () async {
1123+
if (!isSelectedNotEmpty) {
1124+
return;
1125+
}
1126+
final List<AssetEntity> _selected;
1127+
if (isWeChatMoment) {
1128+
_selected = provider.selectedAssets
1129+
.where((AssetEntity e) => e.type == AssetType.image)
1130+
.toList();
1131+
} else {
1132+
_selected = provider.selectedAssets;
1133+
}
1134+
final List<AssetEntity>? result =
1135+
await AssetPickerViewer.pushToViewer(
1136+
context,
1137+
currentIndex: 0,
1138+
previewAssets: _selected,
1139+
previewThumbSize: previewThumbSize,
1140+
selectedAssets: _selected,
1141+
selectorProvider: provider as DefaultAssetPickerProvider,
1142+
themeData: theme,
1143+
maxAssets: provider.maxAssets,
1144+
);
1145+
if (result != null) {
1146+
Navigator.of(context).pop(result);
1147+
}
1148+
},
1149+
child: Selector<DefaultAssetPickerProvider, String>(
1150+
selector: (_, DefaultAssetPickerProvider p) =>
1151+
p.selectedDescriptions,
1152+
builder: (_, __, ___) => Padding(
1153+
padding: const EdgeInsets.symmetric(vertical: 12.0),
1154+
child: Text(
11531155
isSelectedNotEmpty
11541156
? '${Constants.textDelegate.preview}'
11551157
'(${provider.selectedAssets.length})'
@@ -1160,11 +1162,11 @@ class DefaultAssetPickerBuilderDelegate
11601162
: theme.textTheme.caption?.color,
11611163
fontSize: 18.0,
11621164
),
1163-
);
1164-
},
1165+
),
1166+
),
11651167
),
1166-
),
1167-
),
1168+
);
1169+
},
11681170
);
11691171
}
11701172

@@ -1287,6 +1289,7 @@ class DefaultAssetPickerBuilderDelegate
12871289
selectedAssets: _selected,
12881290
selectorProvider: provider as DefaultAssetPickerProvider,
12891291
specialPickerType: specialPickerType,
1292+
maxAssets: provider.maxAssets,
12901293
);
12911294
if (result != null) {
12921295
Navigator.of(context).pop(result);

lib/src/delegates/asset_picker_viewer_builder_delegate.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ abstract class AssetPickerViewerBuilderDelegate<A, P> {
2121
this.selectorProvider,
2222
this.provider,
2323
this.selectedAssets,
24+
this.maxAssets,
2425
});
2526

2627
/// [ChangeNotifier] for photo selector viewer.
@@ -65,6 +66,10 @@ abstract class AssetPickerViewerBuilderDelegate<A, P> {
6566
/// 当前查看的索引
6667
int currentIndex;
6768

69+
/// Maximum count for asset selection.
70+
/// 资源选择的最大数量
71+
final int? maxAssets;
72+
6873
/// Whether the viewer is under preview mode for selected assets.
6974
/// 当前是否处于查看已选中资源的模式
7075
late final bool isSelectedPreviewing = selectedAssets == previewAssets;
@@ -121,6 +126,9 @@ abstract class AssetPickerViewerBuilderDelegate<A, P> {
121126
}
122127

123128
void selectAsset(A entity) {
129+
if (maxAssets != null && selectedCount >= maxAssets!) {
130+
return;
131+
}
124132
provider?.selectAssetEntity(entity);
125133
if (!isSelectedPreviewing) {
126134
selectedAssets?.add(entity);
@@ -203,13 +211,15 @@ class DefaultAssetPickerViewerBuilderDelegate
203211
List<AssetEntity>? selectedAssets,
204212
this.previewThumbSize,
205213
this.specialPickerType,
214+
int? maxAssets,
206215
}) : super(
207216
currentIndex: currentIndex,
208217
previewAssets: previewAssets,
209218
provider: provider,
210219
themeData: themeData,
211220
selectedAssets: selectedAssets,
212221
selectorProvider: selectorProvider,
222+
maxAssets: maxAssets,
213223
);
214224

215225
/// Thumb size for the preview of images in the viewer.

lib/src/widget/asset_picker_viewer.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class AssetPickerViewer<A, P> extends StatefulWidget {
3232
List<int>? previewThumbSize,
3333
List<AssetEntity>? selectedAssets,
3434
SpecialPickerType? specialPickerType,
35+
int? maxAssets,
3536
}) async {
3637
try {
3738
final Widget viewer = AssetPickerViewer<AssetEntity, AssetPathEntity>(
@@ -46,6 +47,7 @@ class AssetPickerViewer<A, P> extends StatefulWidget {
4647
specialPickerType: specialPickerType,
4748
selectedAssets: selectedAssets,
4849
selectorProvider: selectorProvider,
50+
maxAssets: maxAssets,
4951
),
5052
);
5153
final PageRouteBuilder<List<AssetEntity>> pageRoute =

0 commit comments

Comments
 (0)