Skip to content

Commit 4416f1d

Browse files
authored
🚀 Pass through selectPredicate to AssetPickerViewer (#211)
1 parent 234f7b3 commit 4416f1d

File tree

3 files changed

+58
-25
lines changed

3 files changed

+58
-25
lines changed

lib/src/delegates/asset_picker_builder_delegate.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ typedef IndicatorBuilder = Widget Function(
2323
bool isAssetsEmpty,
2424
);
2525

26+
/// {@template wechat_assets_picker.AssetSelectPredicate}
27+
/// Predicate whether an asset can be selected or unselected.
28+
/// 判断资源可否被选择
29+
/// {@endtemplate}
2630
typedef AssetSelectPredicate<Asset> = FutureOr<bool> Function(
2731
BuildContext context,
2832
Asset asset,
@@ -109,8 +113,7 @@ abstract class AssetPickerBuilderDelegate<Asset, Path> {
109113
/// 选择器是否可以从同样的位置开始选择
110114
final bool keepScrollOffset;
111115

112-
/// Predicate whether an asset can be selected or unselected.
113-
/// 判断资源可否被选择
116+
/// {@macro wechat_assets_picker.AssetSelectPredicate}
114117
final AssetSelectPredicate<Asset>? selectPredicate;
115118

116119
/// The [ScrollController] for the preview grid.

lib/src/delegates/asset_picker_viewer_builder_delegate.dart

Lines changed: 51 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ abstract class AssetPickerViewerBuilderDelegate<Asset, Path> {
2525
this.selectedAssets,
2626
this.maxAssets,
2727
this.shouldReversePreview = false,
28+
this.selectPredicate,
2829
});
2930

3031
/// [ChangeNotifier] for photo selector viewer.
@@ -55,6 +56,9 @@ abstract class AssetPickerViewerBuilderDelegate<Asset, Path> {
5556
/// 通常用户使用苹果系统时,点击网格内容进行预览,是反向进行预览。
5657
final bool shouldReversePreview;
5758

59+
/// {@macro wechat_assets_picker.AssetSelectPredicate}
60+
final AssetSelectPredicate<Asset>? selectPredicate;
61+
5862
/// [StreamController] for viewing page index update.
5963
/// 用于更新当前正在浏览的资源页码的流控制器
6064
///
@@ -229,6 +233,26 @@ abstract class AssetPickerViewerBuilderDelegate<Asset, Path> {
229233
}
230234
}
231235

236+
Future<void> onChangingSelected(
237+
BuildContext context,
238+
Asset asset,
239+
bool isSelected,
240+
) async {
241+
final bool? selectPredicateResult = await selectPredicate?.call(
242+
context,
243+
asset,
244+
isSelected,
245+
);
246+
if (selectPredicateResult == false) {
247+
return;
248+
}
249+
if (isSelected) {
250+
unSelectAsset(asset);
251+
return;
252+
}
253+
selectAsset(asset);
254+
}
255+
232256
/// Method to switch [isDisplayingDetail].
233257
/// 切换显示详情状态的方法
234258
void switchDisplayingDetail({bool? value}) {
@@ -319,6 +343,7 @@ class DefaultAssetPickerViewerBuilderDelegate
319343
this.specialPickerType,
320344
int? maxAssets,
321345
bool shouldReversePreview = false,
346+
AssetSelectPredicate<AssetEntity>? selectPredicate,
322347
}) : super(
323348
currentIndex: currentIndex,
324349
previewAssets: previewAssets,
@@ -328,6 +353,7 @@ class DefaultAssetPickerViewerBuilderDelegate
328353
selectorProvider: selectorProvider,
329354
maxAssets: maxAssets,
330355
shouldReversePreview: shouldReversePreview,
356+
selectPredicate: selectPredicate,
331357
);
332358

333359
/// Thumb size for the preview of images in the viewer.
@@ -733,21 +759,19 @@ class DefaultAssetPickerViewerBuilderDelegate
733759

734760
/// Select button for apple OS.
735761
/// 苹果系列系统的选择按钮
736-
Widget _appleOSSelectButton(bool isSelected, AssetEntity asset) {
762+
Widget _appleOSSelectButton(
763+
BuildContext context,
764+
bool isSelected,
765+
AssetEntity asset,
766+
) {
737767
if (!isSelected && selectedMaximumAssets) {
738768
return const SizedBox.shrink();
739769
}
740770
return Padding(
741771
padding: const EdgeInsetsDirectional.only(end: 10.0),
742772
child: GestureDetector(
743773
behavior: HitTestBehavior.opaque,
744-
onTap: () {
745-
if (isSelected) {
746-
unSelectAsset(asset);
747-
return;
748-
}
749-
selectAsset(asset);
750-
},
774+
onTap: () => onChangingSelected(context, asset, isSelected),
751775
child: AnimatedContainer(
752776
duration: kThemeAnimationDuration,
753777
width: 28.0,
@@ -766,19 +790,17 @@ class DefaultAssetPickerViewerBuilderDelegate
766790

767791
/// Select button for Android.
768792
/// 安卓系统的选择按钮
769-
Widget _androidSelectButton(bool isSelected, AssetEntity asset) {
793+
Widget _androidSelectButton(
794+
BuildContext context,
795+
bool isSelected,
796+
AssetEntity asset,
797+
) {
770798
return CustomCheckbox(
771799
value: isSelected,
772800
shape: RoundedRectangleBorder(
773801
borderRadius: BorderRadius.circular(999999),
774802
),
775-
onChanged: (bool? value) {
776-
if (isSelected) {
777-
unSelectAsset(asset);
778-
return;
779-
}
780-
selectAsset(asset);
781-
},
803+
onChanged: (_) => onChangingSelected(context, asset, isSelected),
782804
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
783805
);
784806
}
@@ -801,15 +823,21 @@ class DefaultAssetPickerViewerBuilderDelegate
801823
AssetPickerViewerProvider<AssetEntity> p,
802824
) =>
803825
p.currentlySelectedAssets,
804-
builder: (_, List<AssetEntity> currentlySelectedAssets, __) {
805-
final AssetEntity asset =
806-
previewAssets.elementAt(snapshot.data!);
807-
final bool isSelected =
808-
currentlySelectedAssets.contains(asset);
826+
builder: (
827+
BuildContext c,
828+
List<AssetEntity> currentlySelectedAssets,
829+
__,
830+
) {
831+
final AssetEntity asset = previewAssets.elementAt(
832+
snapshot.data!,
833+
);
834+
final bool isSelected = currentlySelectedAssets.contains(
835+
asset,
836+
);
809837
if (isAppleOS) {
810-
return _appleOSSelectButton(isSelected, asset);
838+
return _appleOSSelectButton(c, isSelected, asset);
811839
}
812-
return _androidSelectButton(isSelected, asset);
840+
return _androidSelectButton(c, isSelected, asset);
813841
},
814842
),
815843
);

lib/src/widget/asset_picker_viewer.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class AssetPickerViewer<Asset, Path> extends StatefulWidget {
3333
SpecialPickerType? specialPickerType,
3434
int? maxAssets,
3535
bool shouldReversePreview = false,
36+
AssetSelectPredicate<AssetEntity>? selectPredicate,
3637
}) async {
3738
await AssetPicker.permissionCheck();
3839
final Widget viewer = AssetPickerViewer<AssetEntity, AssetPathEntity>(
@@ -49,6 +50,7 @@ class AssetPickerViewer<Asset, Path> extends StatefulWidget {
4950
selectorProvider: selectorProvider,
5051
maxAssets: maxAssets,
5152
shouldReversePreview: shouldReversePreview,
53+
selectPredicate: selectPredicate,
5254
),
5355
);
5456
final PageRouteBuilder<List<AssetEntity>> pageRoute =

0 commit comments

Comments
 (0)