@@ -25,6 +25,7 @@ abstract class AssetPickerViewerBuilderDelegate<Asset, Path> {
25
25
this .selectedAssets,
26
26
this .maxAssets,
27
27
this .shouldReversePreview = false ,
28
+ this .selectPredicate,
28
29
});
29
30
30
31
/// [ChangeNotifier] for photo selector viewer.
@@ -55,6 +56,9 @@ abstract class AssetPickerViewerBuilderDelegate<Asset, Path> {
55
56
/// 通常用户使用苹果系统时,点击网格内容进行预览,是反向进行预览。
56
57
final bool shouldReversePreview;
57
58
59
+ /// {@macro wechat_assets_picker.AssetSelectPredicate}
60
+ final AssetSelectPredicate <Asset >? selectPredicate;
61
+
58
62
/// [StreamController] for viewing page index update.
59
63
/// 用于更新当前正在浏览的资源页码的流控制器
60
64
///
@@ -229,6 +233,26 @@ abstract class AssetPickerViewerBuilderDelegate<Asset, Path> {
229
233
}
230
234
}
231
235
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
+
232
256
/// Method to switch [isDisplayingDetail] .
233
257
/// 切换显示详情状态的方法
234
258
void switchDisplayingDetail ({bool ? value}) {
@@ -319,6 +343,7 @@ class DefaultAssetPickerViewerBuilderDelegate
319
343
this .specialPickerType,
320
344
int ? maxAssets,
321
345
bool shouldReversePreview = false ,
346
+ AssetSelectPredicate <AssetEntity >? selectPredicate,
322
347
}) : super (
323
348
currentIndex: currentIndex,
324
349
previewAssets: previewAssets,
@@ -328,6 +353,7 @@ class DefaultAssetPickerViewerBuilderDelegate
328
353
selectorProvider: selectorProvider,
329
354
maxAssets: maxAssets,
330
355
shouldReversePreview: shouldReversePreview,
356
+ selectPredicate: selectPredicate,
331
357
);
332
358
333
359
/// Thumb size for the preview of images in the viewer.
@@ -733,21 +759,19 @@ class DefaultAssetPickerViewerBuilderDelegate
733
759
734
760
/// Select button for apple OS.
735
761
/// 苹果系列系统的选择按钮
736
- Widget _appleOSSelectButton (bool isSelected, AssetEntity asset) {
762
+ Widget _appleOSSelectButton (
763
+ BuildContext context,
764
+ bool isSelected,
765
+ AssetEntity asset,
766
+ ) {
737
767
if (! isSelected && selectedMaximumAssets) {
738
768
return const SizedBox .shrink ();
739
769
}
740
770
return Padding (
741
771
padding: const EdgeInsetsDirectional .only (end: 10.0 ),
742
772
child: GestureDetector (
743
773
behavior: HitTestBehavior .opaque,
744
- onTap: () {
745
- if (isSelected) {
746
- unSelectAsset (asset);
747
- return ;
748
- }
749
- selectAsset (asset);
750
- },
774
+ onTap: () => onChangingSelected (context, asset, isSelected),
751
775
child: AnimatedContainer (
752
776
duration: kThemeAnimationDuration,
753
777
width: 28.0 ,
@@ -766,19 +790,17 @@ class DefaultAssetPickerViewerBuilderDelegate
766
790
767
791
/// Select button for Android.
768
792
/// 安卓系统的选择按钮
769
- Widget _androidSelectButton (bool isSelected, AssetEntity asset) {
793
+ Widget _androidSelectButton (
794
+ BuildContext context,
795
+ bool isSelected,
796
+ AssetEntity asset,
797
+ ) {
770
798
return CustomCheckbox (
771
799
value: isSelected,
772
800
shape: RoundedRectangleBorder (
773
801
borderRadius: BorderRadius .circular (999999 ),
774
802
),
775
- onChanged: (bool ? value) {
776
- if (isSelected) {
777
- unSelectAsset (asset);
778
- return ;
779
- }
780
- selectAsset (asset);
781
- },
803
+ onChanged: (_) => onChangingSelected (context, asset, isSelected),
782
804
materialTapTargetSize: MaterialTapTargetSize .shrinkWrap,
783
805
);
784
806
}
@@ -801,15 +823,21 @@ class DefaultAssetPickerViewerBuilderDelegate
801
823
AssetPickerViewerProvider <AssetEntity > p,
802
824
) =>
803
825
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
+ );
809
837
if (isAppleOS) {
810
- return _appleOSSelectButton (isSelected, asset);
838
+ return _appleOSSelectButton (c, isSelected, asset);
811
839
}
812
- return _androidSelectButton (isSelected, asset);
840
+ return _androidSelectButton (c, isSelected, asset);
813
841
},
814
842
),
815
843
);
0 commit comments