Skip to content

Commit 339ac92

Browse files
authored
⚡️ Improve selection callers between picker and viewer (#327)
1 parent 6675e04 commit 339ac92

File tree

11 files changed

+129
-94
lines changed

11 files changed

+129
-94
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ that can be found in the LICENSE file. -->
44

55
# Changelog
66

7+
## 7.3.1
8+
9+
### Improvements
10+
11+
- Improve selection callers between picker and viewer. (#327)
12+
713
## 7.3.0
814

915
Migrate to Flutter 3, drop supports for previous Flutter versions.

example/lib/constants/page_mixin.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ mixin ExamplePageMixin<T extends StatefulWidget> on State<T> {
3939
Future<void> selectAssets(PickMethod model) async {
4040
final List<AssetEntity>? result = await model.method(context, assets);
4141
if (result != null) {
42-
assets = List<AssetEntity>.from(result);
42+
assets = result.toList();
4343
if (mounted) {
4444
setState(() {});
4545
}
@@ -56,7 +56,7 @@ mixin ExamplePageMixin<T extends StatefulWidget> on State<T> {
5656

5757
void onResult(List<AssetEntity>? result) {
5858
if (result != null && result != assets) {
59-
assets = List<AssetEntity>.from(result);
59+
assets = result.toList();
6060
if (mounted) {
6161
setState(() {});
6262
}

example/lib/customs/pickers/directory_file_asset_picker.dart

Lines changed: 35 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ class FileAssetPickerProvider extends AssetPickerProvider<File, Directory> {
343343

344344
@override
345345
void unSelectAsset(File item) {
346-
final List<File> set = List<File>.from(selectedAssets);
346+
final List<File> set = selectedAssets.toList();
347347
set.removeWhere((File f) => f.path == item.path);
348348
selectedAssets = set;
349349
}
@@ -1185,10 +1185,10 @@ class FileAssetPickerViewerProvider extends AssetPickerViewerProvider<File> {
11851185
FileAssetPickerViewerProvider(List<File> super.assets);
11861186

11871187
@override
1188-
void unSelectAssetEntity(File entity) {
1189-
final List<File> set = List<File>.from(currentlySelectedAssets);
1190-
set.removeWhere((File f) => f.path == entity.path);
1191-
currentlySelectedAssets = List<File>.from(set);
1188+
void unSelectAsset(File item) {
1189+
final List<File> list = currentlySelectedAssets.toList()
1190+
..removeWhere((File f) => f.path == item.path);
1191+
currentlySelectedAssets = list;
11921192
}
11931193
}
11941194

@@ -1388,34 +1388,31 @@ class FileAssetPickerViewerBuilderDelegate
13881388

13891389
@override
13901390
Widget build(BuildContext context) {
1391-
return WillPopScope(
1392-
onWillPop: syncSelectedAssetsWhenPop,
1393-
child: Theme(
1394-
data: themeData,
1395-
child: AnnotatedRegion<SystemUiOverlayStyle>(
1396-
value: themeData.brightness == Brightness.dark
1397-
? SystemUiOverlayStyle.light
1398-
: SystemUiOverlayStyle.dark,
1399-
child: Material(
1400-
color: Colors.black,
1401-
child: Stack(
1402-
children: <Widget>[
1403-
Positioned.fill(
1404-
child: PageView.builder(
1405-
physics: const BouncingScrollPhysics(),
1406-
controller: _pageController,
1407-
itemCount: previewAssets.length,
1408-
itemBuilder: assetPageBuilder,
1409-
onPageChanged: (int index) {
1410-
currentIndex = index;
1411-
pageStreamController.add(index);
1412-
},
1413-
),
1391+
return Theme(
1392+
data: themeData,
1393+
child: AnnotatedRegion<SystemUiOverlayStyle>(
1394+
value: themeData.brightness == Brightness.dark
1395+
? SystemUiOverlayStyle.light
1396+
: SystemUiOverlayStyle.dark,
1397+
child: Material(
1398+
color: Colors.black,
1399+
child: Stack(
1400+
children: <Widget>[
1401+
Positioned.fill(
1402+
child: PageView.builder(
1403+
physics: const BouncingScrollPhysics(),
1404+
controller: _pageController,
1405+
itemCount: previewAssets.length,
1406+
itemBuilder: assetPageBuilder,
1407+
onPageChanged: (int index) {
1408+
currentIndex = index;
1409+
pageStreamController.add(index);
1410+
},
14141411
),
1415-
appBar(context),
1416-
if (selectedAssets != null) bottomDetailBuilder(context),
1417-
],
1418-
),
1412+
),
1413+
appBar(context),
1414+
if (selectedAssets != null) bottomDetailBuilder(context),
1415+
],
14191416
),
14201417
),
14211418
),
@@ -1521,9 +1518,9 @@ class FileAssetPickerViewerBuilderDelegate
15211518
behavior: HitTestBehavior.opaque,
15221519
onTap: () {
15231520
if (isSelected) {
1524-
provider?.unSelectAssetEntity(asset);
1521+
provider?.unSelectAsset(asset);
15251522
} else {
1526-
provider?.selectAssetEntity(asset);
1523+
provider?.selectAsset(asset);
15271524
}
15281525
},
15291526
child: AnimatedContainer(
@@ -1557,9 +1554,11 @@ class FileAssetPickerViewerBuilderDelegate
15571554
value: isSelected,
15581555
onChanged: (bool? value) {
15591556
if (isSelected) {
1560-
provider?.unSelectAssetEntity(asset);
1557+
provider?.unSelectAsset(asset);
1558+
selectorProvider?.unSelectAsset(asset);
15611559
} else {
1562-
provider?.selectAssetEntity(asset);
1560+
provider?.selectAsset(asset);
1561+
selectorProvider?.selectAsset(asset);
15631562
}
15641563
},
15651564
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,

example/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: wechat_assets_picker_demo
22
description: The demo project for the wechat_assets_picker package.
3-
version: 7.3.0+17
3+
version: 7.3.1+18
44
publish_to: none
55

66
environment:

lib/src/constants/config.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ import 'enums.dart';
1414
class AssetPickerConfig {
1515
const AssetPickerConfig({
1616
this.selectedAssets,
17-
this.maxAssets = 9,
18-
this.pageSize = 80,
17+
this.maxAssets = defaultMaxAssetsCount,
18+
this.pageSize = defaultAssetsPerPage,
1919
this.gridThumbnailSize = defaultAssetGridPreviewSize,
2020
this.pathThumbnailSize = defaultPathThumbnailSize,
2121
this.previewThumbnailSize,

lib/src/constants/constants.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
import 'package:flutter/painting.dart';
66
import 'package:photo_manager/photo_manager.dart';
77

8+
const int defaultAssetsPerPage = 80;
9+
const int defaultMaxAssetsCount = 9;
10+
811
/// Default theme color from WeChat.
912
const Color defaultThemeColorWeChat = Color(0xff00bc56);
1013

lib/src/delegates/asset_picker_viewer_builder_delegate.dart

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,8 @@ abstract class AssetPickerViewerBuilderDelegate<Asset, Path> {
235235
ValueNotifier<int>(selectedCount);
236236

237237
void unSelectAsset(Asset entity) {
238-
provider?.unSelectAssetEntity(entity);
238+
provider?.unSelectAsset(entity);
239+
selectorProvider?.unSelectAsset(entity);
239240
if (!isSelectedPreviewing) {
240241
selectedAssets?.remove(entity);
241242
}
@@ -248,7 +249,8 @@ abstract class AssetPickerViewerBuilderDelegate<Asset, Path> {
248249
if (maxAssets != null && selectedCount >= maxAssets!) {
249250
return;
250251
}
251-
provider?.selectAssetEntity(entity);
252+
provider?.selectAsset(entity);
253+
selectorProvider?.selectAsset(entity);
252254
if (!isSelectedPreviewing) {
253255
selectedAssets?.add(entity);
254256
}
@@ -285,6 +287,7 @@ abstract class AssetPickerViewerBuilderDelegate<Asset, Path> {
285287

286288
/// Sync selected assets currently with asset picker provider.
287289
/// 在预览中当前已选的图片同步到选择器的状态
290+
@Deprecated('The method is not used by the package anymore')
288291
Future<bool> syncSelectedAssetsWhenPop() async {
289292
if (provider?.currentlySelectedAssets != null) {
290293
selectorProvider?.selectedAssets = provider!.currentlySelectedAssets;
@@ -971,35 +974,32 @@ class DefaultAssetPickerViewerBuilderDelegate
971974

972975
@override
973976
Widget build(BuildContext context) {
974-
return WillPopScope(
975-
onWillPop: syncSelectedAssetsWhenPop,
976-
child: Theme(
977-
data: themeData,
978-
child: AnnotatedRegion<SystemUiOverlayStyle>(
979-
value: themeData.appBarTheme.systemOverlayStyle ??
980-
(themeData.effectiveBrightness.isDark
981-
? SystemUiOverlayStyle.light
982-
: SystemUiOverlayStyle.dark),
983-
child: Material(
984-
color: themeData.colorScheme.onSecondary,
985-
child: Stack(
986-
children: <Widget>[
987-
Positioned.fill(child: _pageViewBuilder(context)),
988-
if (isWeChatMoment && hasVideo) ...<Widget>[
989-
momentVideoBackButton(context),
990-
PositionedDirectional(
991-
end: 16,
992-
bottom: context.bottomPadding + 16,
993-
child: confirmButton(context),
994-
),
995-
] else ...<Widget>[
996-
appBar(context),
997-
if (selectedAssets != null ||
998-
(isWeChatMoment && hasVideo && isAppleOS))
999-
bottomDetailBuilder(context),
1000-
],
977+
return Theme(
978+
data: themeData,
979+
child: AnnotatedRegion<SystemUiOverlayStyle>(
980+
value: themeData.appBarTheme.systemOverlayStyle ??
981+
(themeData.effectiveBrightness.isDark
982+
? SystemUiOverlayStyle.light
983+
: SystemUiOverlayStyle.dark),
984+
child: Material(
985+
color: themeData.colorScheme.onSecondary,
986+
child: Stack(
987+
children: <Widget>[
988+
Positioned.fill(child: _pageViewBuilder(context)),
989+
if (isWeChatMoment && hasVideo) ...<Widget>[
990+
momentVideoBackButton(context),
991+
PositionedDirectional(
992+
end: 16,
993+
bottom: context.bottomPadding + 16,
994+
child: confirmButton(context),
995+
),
996+
] else ...<Widget>[
997+
appBar(context),
998+
if (selectedAssets != null ||
999+
(isWeChatMoment && hasVideo && isAppleOS))
1000+
bottomDetailBuilder(context),
10011001
],
1002-
),
1002+
],
10031003
),
10041004
),
10051005
),

lib/src/provider/asset_picker_provider.dart

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,13 @@ import '../internal/singleton.dart';
2121
/// and how to get the thumbnail data of a path.
2222
abstract class AssetPickerProvider<Asset, Path> extends ChangeNotifier {
2323
AssetPickerProvider({
24-
this.maxAssets = 9,
25-
this.pageSize = 320,
24+
this.maxAssets = defaultMaxAssetsCount,
25+
this.pageSize = defaultAssetsPerPage,
2626
this.pathThumbnailSize = defaultPathThumbnailSize,
2727
List<Asset>? selectedAssets,
2828
}) {
29-
if (selectedAssets?.isNotEmpty ?? false) {
30-
_selectedAssets = List<Asset>.from(selectedAssets!);
29+
if (selectedAssets != null && selectedAssets.isNotEmpty) {
30+
_selectedAssets = selectedAssets.toList();
3131
}
3232
}
3333

@@ -172,7 +172,7 @@ abstract class AssetPickerProvider<Asset, Path> extends ChangeNotifier {
172172
if (value == _currentAssets) {
173173
return;
174174
}
175-
_currentAssets = List<Asset>.from(value);
175+
_currentAssets = value.toList();
176176
notifyListeners();
177177
}
178178

@@ -185,7 +185,7 @@ abstract class AssetPickerProvider<Asset, Path> extends ChangeNotifier {
185185
if (value == _selectedAssets) {
186186
return;
187187
}
188-
_selectedAssets = List<Asset>.from(value);
188+
_selectedAssets = value.toList();
189189
notifyListeners();
190190
}
191191

@@ -212,15 +212,15 @@ abstract class AssetPickerProvider<Asset, Path> extends ChangeNotifier {
212212
if (selectedAssets.length == maxAssets || selectedAssets.contains(item)) {
213213
return;
214214
}
215-
final List<Asset> set = List<Asset>.from(selectedAssets);
215+
final List<Asset> set = selectedAssets.toList();
216216
set.add(item);
217217
selectedAssets = set;
218218
}
219219

220220
/// Un-select asset.
221221
/// 取消选中资源
222222
void unSelectAsset(Asset item) {
223-
final List<Asset> set = List<Asset>.from(selectedAssets);
223+
final List<Asset> set = selectedAssets.toList();
224224
set.remove(item);
225225
selectedAssets = set;
226226
}
@@ -344,7 +344,7 @@ class DefaultAssetPickerProvider
344344
page: page,
345345
size: pageSize,
346346
);
347-
_currentAssets = List<AssetEntity>.of(list);
347+
_currentAssets = list.toList();
348348
_hasAssetsToDisplay = currentAssets.isNotEmpty;
349349
notifyListeners();
350350
}
@@ -355,7 +355,7 @@ class DefaultAssetPickerProvider
355355
page: currentAssetsListPage,
356356
size: pageSize,
357357
);
358-
final List<AssetEntity> assets = List<AssetEntity>.of(list);
358+
final List<AssetEntity> assets = list.toList();
359359
if (assets.isNotEmpty && currentAssets.contains(assets[0])) {
360360
return;
361361
}

lib/src/provider/asset_picker_viewer_provider.dart

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,26 @@
22
// Use of this source code is governed by an Apache license that can be found
33
// in the LICENSE file.
44

5-
import 'package:flutter/material.dart';
5+
import 'package:flutter/widgets.dart';
6+
7+
import '../constants/constants.dart';
68

79
/// [ChangeNotifier] for assets picker viewer.
810
/// 资源选择查看器的 provider model.
911
class AssetPickerViewerProvider<A> extends ChangeNotifier {
1012
/// Copy selected assets for editing when constructing.
1113
/// 构造时深拷贝已选择的资源集合,用于后续编辑。
12-
AssetPickerViewerProvider(List<A>? assets) {
13-
_currentlySelectedAssets = List<A>.from(assets ?? <A>[]);
14+
AssetPickerViewerProvider(
15+
List<A>? assets, {
16+
this.maxAssets = defaultMaxAssetsCount,
17+
}) {
18+
_currentlySelectedAssets = (assets ?? <A>[]).toList();
1419
}
1520

21+
/// Maximum count for asset selection.
22+
/// 资源选择的最大数量
23+
final int maxAssets;
24+
1625
/// Selected assets in the viewer.
1726
/// 查看器中已选择的资源
1827
late List<A> _currentlySelectedAssets;
@@ -32,17 +41,29 @@ class AssetPickerViewerProvider<A> extends ChangeNotifier {
3241

3342
/// Select asset.
3443
/// 选中资源
35-
void selectAssetEntity(A entity) {
36-
final List<A> set = List<A>.from(currentlySelectedAssets);
37-
set.add(entity);
38-
currentlySelectedAssets = List<A>.from(set);
44+
void selectAsset(A item) {
45+
if (currentlySelectedAssets.length == maxAssets ||
46+
currentlySelectedAssets.contains(item)) {
47+
return;
48+
}
49+
final List<A> newList = _currentlySelectedAssets.toList()..add(item);
50+
currentlySelectedAssets = newList;
3951
}
4052

4153
/// Un-select asset.
4254
/// 取消选中资源
43-
void unSelectAssetEntity(A entity) {
44-
final List<A> set = List<A>.from(currentlySelectedAssets);
45-
set.remove(entity);
46-
currentlySelectedAssets = List<A>.from(set);
55+
void unSelectAsset(A item) {
56+
if (currentlySelectedAssets.isEmpty ||
57+
!currentlySelectedAssets.contains(item)) {
58+
return;
59+
}
60+
final List<A> newList = _currentlySelectedAssets.toList()..remove(item);
61+
currentlySelectedAssets = newList;
4762
}
63+
64+
@Deprecated('Use selectAsset instead')
65+
void selectAssetEntity(A entity) => selectAsset(entity);
66+
67+
@Deprecated('Use unSelectAsset instead')
68+
void unselectAssetEntity(A entity) => unSelectAsset(entity);
4869
}

0 commit comments

Comments
 (0)