4
4
5
5
import 'dart:async' ;
6
6
import 'dart:math' as math;
7
- import 'dart:typed_data' as typed_data;
8
7
import 'dart:ui' as ui;
9
8
10
9
import 'package:flutter/gestures.dart' ;
@@ -200,20 +199,24 @@ abstract class AssetPickerBuilderDelegate<Asset, Path> {
200
199
/// 权限受限栏的高度
201
200
double get permissionLimitedBarHeight => isPermissionLimited ? 75 : 0 ;
202
201
202
+ @Deprecated ('Use permissionNotifier instead. This will be removed in 10.0.0' )
203
+ ValueNotifier <PermissionState > get permission => permissionNotifier;
204
+
203
205
/// Notifier for the current [PermissionState] .
204
206
/// 当前 [PermissionState] 的监听
205
- late final ValueNotifier <PermissionState > permission =
206
- ValueNotifier <PermissionState >(
207
+ late final permissionNotifier = ValueNotifier <PermissionState >(
207
208
initialPermission,
208
209
);
209
- late final ValueNotifier <bool > permissionOverlayDisplay = ValueNotifier <bool >(
210
- limitedPermissionOverlayPredicate? .call (permission.value) ??
211
- (permission.value == PermissionState .limited),
210
+
211
+ late final permissionOverlayDisplay = ValueNotifier <bool >(
212
+ limitedPermissionOverlayPredicate? .call (permissionNotifier.value) ??
213
+ (permissionNotifier.value == PermissionState .limited),
212
214
);
213
215
214
216
/// Whether the permission is limited currently.
215
217
/// 当前的权限是否为受限
216
- bool get isPermissionLimited => permission.value == PermissionState .limited;
218
+ bool get isPermissionLimited =>
219
+ permissionNotifier.value == PermissionState .limited;
217
220
218
221
bool effectiveShouldRevertGrid (BuildContext context) =>
219
222
shouldRevertGrid ?? isAppleOS (context);
@@ -235,7 +238,7 @@ abstract class AssetPickerBuilderDelegate<Asset, Path> {
235
238
Singleton .scrollPosition = null ;
236
239
gridScrollController.dispose ();
237
240
isSwitchingPath.dispose ();
238
- permission .dispose ();
241
+ permissionNotifier .dispose ();
239
242
permissionOverlayDisplay.dispose ();
240
243
}
241
244
@@ -660,7 +663,7 @@ abstract class AssetPickerBuilderDelegate<Asset, Path> {
660
663
);
661
664
662
665
return ValueListenableBuilder2 <PermissionState , bool >(
663
- firstNotifier: permission ,
666
+ firstNotifier: permissionNotifier ,
664
667
secondNotifier: permissionOverlayDisplay,
665
668
builder: (_, PermissionState ps, bool isDisplay, __) {
666
669
if (ps.isAuth || ! isDisplay) {
@@ -850,11 +853,12 @@ class DefaultAssetPickerBuilderDelegate
850
853
851
854
@override
852
855
Future <void > onAssetsChanged (MethodCall call, StateSetter setState) async {
856
+ final permission = permissionNotifier.value;
857
+
853
858
bool predicate () {
854
- final p = permission.value;
855
859
final path = provider.currentPath? .path;
856
860
if (assetsChangeRefreshPredicate != null ) {
857
- return assetsChangeRefreshPredicate !(p , call, path);
861
+ return assetsChangeRefreshPredicate !(permission , call, path);
858
862
}
859
863
return path? .isAll == true ;
860
864
}
@@ -863,17 +867,22 @@ class DefaultAssetPickerBuilderDelegate
863
867
return ;
864
868
}
865
869
866
- assetsChangeCallback? .call (
867
- permission.value,
868
- call,
869
- provider.currentPath? .path,
870
- );
870
+ assetsChangeCallback? .call (permission, call, provider.currentPath? .path);
871
871
872
872
final createIds = < String > [];
873
873
final updateIds = < String > [];
874
874
final deleteIds = < String > [];
875
+ int newCount = 0 ;
876
+ int oldCount = 0 ;
877
+
875
878
// Typically for iOS.
876
879
if (call.arguments case final Map arguments) {
880
+ if (arguments['newCount' ] case final int count) {
881
+ newCount = count;
882
+ }
883
+ if (arguments['oldCount' ] case final int count) {
884
+ oldCount = count;
885
+ }
877
886
for (final e in (arguments['create' ] as List ? ) ?? []) {
878
887
if (e['id' ] case final String id) {
879
888
createIds.add (id);
@@ -889,7 +898,12 @@ class DefaultAssetPickerBuilderDelegate
889
898
deleteIds.add (id);
890
899
}
891
900
}
892
- if (createIds.isEmpty && updateIds.isEmpty && deleteIds.isEmpty) {
901
+ if (createIds.isEmpty &&
902
+ updateIds.isEmpty &&
903
+ deleteIds.isEmpty &&
904
+ // Updates with limited permission on iOS does not provide any IDs.
905
+ // Counting on length changes is not reliable.
906
+ (newCount == oldCount && permission != PermissionState .limited)) {
893
907
return ;
894
908
}
895
909
}
@@ -943,6 +957,7 @@ class DefaultAssetPickerBuilderDelegate
943
957
..totalAssetsCount = assetCount
944
958
..getThumbnailFromPath (newPathWrapper);
945
959
}
960
+ isSwitchingPath.value = false ;
946
961
}).then (lock.complete).catchError (lock.completeError).whenComplete (() {
947
962
onAssetsChangedLock = null ;
948
963
});
@@ -1782,7 +1797,7 @@ class DefaultAssetPickerBuilderDelegate
1782
1797
mainAxisSize: MainAxisSize .min,
1783
1798
children: < Widget > [
1784
1799
ValueListenableBuilder <PermissionState >(
1785
- valueListenable: permission ,
1800
+ valueListenable: permissionNotifier ,
1786
1801
builder: (_, PermissionState ps, Widget ? child) => Semantics (
1787
1802
label: '${semanticsTextDelegate .viewingLimitedAssetsTip }, '
1788
1803
'${semanticsTextDelegate .changeAccessibleLimitedAssets }' ,
@@ -1960,7 +1975,7 @@ class DefaultAssetPickerBuilderDelegate
1960
1975
}) {
1961
1976
final PathWrapper <AssetPathEntity > wrapper = list[index];
1962
1977
final AssetPathEntity pathEntity = wrapper.path;
1963
- final typed_data. Uint8List ? data = wrapper.thumbnailData;
1978
+ final Uint8List ? data = wrapper.thumbnailData;
1964
1979
1965
1980
Widget builder () {
1966
1981
if (data != null ) {
0 commit comments