Skip to content

Commit 4f1fcce

Browse files
authored
⚡️ Improve changes when limited on iOS (#615)
1 parent d7f4d80 commit 4f1fcce

File tree

3 files changed

+36
-20
lines changed

3 files changed

+36
-20
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ that can be found in the LICENSE file. -->
99
1010
## Unreleased
1111

12+
- Improve changes when limited on iOS.
1213
- Use `LocallyAvailableBuilder` in the grid to provide better user awareness.
1314

1415
## 9.2.0

lib/src/delegates/asset_picker_builder_delegate.dart

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import 'dart:async';
66
import 'dart:math' as math;
7-
import 'dart:typed_data' as typed_data;
87
import 'dart:ui' as ui;
98

109
import 'package:flutter/gestures.dart';
@@ -200,20 +199,24 @@ abstract class AssetPickerBuilderDelegate<Asset, Path> {
200199
/// 权限受限栏的高度
201200
double get permissionLimitedBarHeight => isPermissionLimited ? 75 : 0;
202201

202+
@Deprecated('Use permissionNotifier instead. This will be removed in 10.0.0')
203+
ValueNotifier<PermissionState> get permission => permissionNotifier;
204+
203205
/// Notifier for the current [PermissionState].
204206
/// 当前 [PermissionState] 的监听
205-
late final ValueNotifier<PermissionState> permission =
206-
ValueNotifier<PermissionState>(
207+
late final permissionNotifier = ValueNotifier<PermissionState>(
207208
initialPermission,
208209
);
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),
212214
);
213215

214216
/// Whether the permission is limited currently.
215217
/// 当前的权限是否为受限
216-
bool get isPermissionLimited => permission.value == PermissionState.limited;
218+
bool get isPermissionLimited =>
219+
permissionNotifier.value == PermissionState.limited;
217220

218221
bool effectiveShouldRevertGrid(BuildContext context) =>
219222
shouldRevertGrid ?? isAppleOS(context);
@@ -235,7 +238,7 @@ abstract class AssetPickerBuilderDelegate<Asset, Path> {
235238
Singleton.scrollPosition = null;
236239
gridScrollController.dispose();
237240
isSwitchingPath.dispose();
238-
permission.dispose();
241+
permissionNotifier.dispose();
239242
permissionOverlayDisplay.dispose();
240243
}
241244

@@ -660,7 +663,7 @@ abstract class AssetPickerBuilderDelegate<Asset, Path> {
660663
);
661664

662665
return ValueListenableBuilder2<PermissionState, bool>(
663-
firstNotifier: permission,
666+
firstNotifier: permissionNotifier,
664667
secondNotifier: permissionOverlayDisplay,
665668
builder: (_, PermissionState ps, bool isDisplay, __) {
666669
if (ps.isAuth || !isDisplay) {
@@ -850,11 +853,12 @@ class DefaultAssetPickerBuilderDelegate
850853

851854
@override
852855
Future<void> onAssetsChanged(MethodCall call, StateSetter setState) async {
856+
final permission = permissionNotifier.value;
857+
853858
bool predicate() {
854-
final p = permission.value;
855859
final path = provider.currentPath?.path;
856860
if (assetsChangeRefreshPredicate != null) {
857-
return assetsChangeRefreshPredicate!(p, call, path);
861+
return assetsChangeRefreshPredicate!(permission, call, path);
858862
}
859863
return path?.isAll == true;
860864
}
@@ -863,17 +867,22 @@ class DefaultAssetPickerBuilderDelegate
863867
return;
864868
}
865869

866-
assetsChangeCallback?.call(
867-
permission.value,
868-
call,
869-
provider.currentPath?.path,
870-
);
870+
assetsChangeCallback?.call(permission, call, provider.currentPath?.path);
871871

872872
final createIds = <String>[];
873873
final updateIds = <String>[];
874874
final deleteIds = <String>[];
875+
int newCount = 0;
876+
int oldCount = 0;
877+
875878
// Typically for iOS.
876879
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+
}
877886
for (final e in (arguments['create'] as List?) ?? []) {
878887
if (e['id'] case final String id) {
879888
createIds.add(id);
@@ -889,7 +898,12 @@ class DefaultAssetPickerBuilderDelegate
889898
deleteIds.add(id);
890899
}
891900
}
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)) {
893907
return;
894908
}
895909
}
@@ -943,6 +957,7 @@ class DefaultAssetPickerBuilderDelegate
943957
..totalAssetsCount = assetCount
944958
..getThumbnailFromPath(newPathWrapper);
945959
}
960+
isSwitchingPath.value = false;
946961
}).then(lock.complete).catchError(lock.completeError).whenComplete(() {
947962
onAssetsChangedLock = null;
948963
});
@@ -1782,7 +1797,7 @@ class DefaultAssetPickerBuilderDelegate
17821797
mainAxisSize: MainAxisSize.min,
17831798
children: <Widget>[
17841799
ValueListenableBuilder<PermissionState>(
1785-
valueListenable: permission,
1800+
valueListenable: permissionNotifier,
17861801
builder: (_, PermissionState ps, Widget? child) => Semantics(
17871802
label: '${semanticsTextDelegate.viewingLimitedAssetsTip}, '
17881803
'${semanticsTextDelegate.changeAccessibleLimitedAssets}',
@@ -1960,7 +1975,7 @@ class DefaultAssetPickerBuilderDelegate
19601975
}) {
19611976
final PathWrapper<AssetPathEntity> wrapper = list[index];
19621977
final AssetPathEntity pathEntity = wrapper.path;
1963-
final typed_data.Uint8List? data = wrapper.thumbnailData;
1978+
final Uint8List? data = wrapper.thumbnailData;
19641979

19651980
Widget builder() {
19661981
if (data != null) {

lib/src/widget/asset_picker.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ class AssetPickerState<Asset, Path> extends State<AssetPicker<Asset, Path>>
125125
if (!mounted) {
126126
return;
127127
}
128-
widget.builder.permission.value = ps;
128+
widget.builder.permissionNotifier.value = ps;
129129
if (ps == PermissionState.limited && Platform.isAndroid) {
130130
_onAssetsUpdated(const MethodCall(''));
131131
}

0 commit comments

Comments
 (0)