Skip to content

Commit 78f197b

Browse files
authored
🐛 Fix Wechat Moment preview issue (#111)
* 🐛 Filtered previewing assets in the special WeChat Moment picker type * 🎨 Move WeChat Moment pick method to multi assets page
1 parent be160f1 commit 78f197b

File tree

4 files changed

+64
-30
lines changed

4 files changed

+64
-30
lines changed

example/lib/pages/multi_assets_page.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,19 @@ class _MultiAssetsPageState extends State<MultiAssetsPage>
4141
PickMethodModel.threeItemsGrid(maxAssetsCount),
4242
PickMethodModel.customFilterOptions(maxAssetsCount),
4343
PickMethodModel.prependItem(maxAssetsCount),
44+
PickMethodModel(
45+
icon: '🎭',
46+
name: 'WeChat Moment',
47+
description: 'Pick assets like the WeChat Moment pattern.',
48+
method: (BuildContext context, List<AssetEntity> assets) {
49+
return AssetPicker.pickAssets(
50+
context,
51+
maxAssets: maxAssetsCount,
52+
selectedAssets: assets,
53+
specialPickerType: SpecialPickerType.wechatMoment,
54+
);
55+
},
56+
),
4457
PickMethodModel.noPreview(maxAssetsCount),
4558
PickMethodModel(
4659
icon: '🎚',

example/lib/pages/single_assets_page.dart

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,19 +41,6 @@ class _SingleAssetPageState extends State<SingleAssetPage>
4141
PickMethodModel.threeItemsGrid(maxAssetsCount),
4242
PickMethodModel.customFilterOptions(maxAssetsCount),
4343
PickMethodModel.prependItem(maxAssetsCount),
44-
PickMethodModel(
45-
icon: '🎭',
46-
name: 'WeChat moment',
47-
description: 'Pick assets like the WeChat moment pattern.',
48-
method: (BuildContext context, List<AssetEntity> assets) {
49-
return AssetPicker.pickAssets(
50-
context,
51-
maxAssets: maxAssetsCount,
52-
selectedAssets: assets,
53-
specialPickerType: SpecialPickerType.wechatMoment,
54-
);
55-
},
56-
),
5744
PickMethodModel.noPreview(maxAssetsCount),
5845
];
5946
}

lib/src/delegates/asset_picker_builder_delegate.dart

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,11 @@ class DefaultAssetPickerBuilderDelegate
474474
/// 切换路径时的动画曲线
475475
Curve get switchingPathCurve => Curves.easeInOut;
476476

477+
/// Whether the [SpecialPickerType.wechatMoment] is enabled.
478+
/// 当前是否为微信朋友圈选择模式
479+
bool get isWeChatMoment =>
480+
specialPickerType == SpecialPickerType.wechatMoment;
481+
477482
/// Whether the preview of assets is enabled.
478483
/// 资源的预览是否启用
479484
bool get isPreviewEnabled => specialPickerType != SpecialPickerType.noPreview;
@@ -650,8 +655,7 @@ class DefaultAssetPickerBuilderDelegate
650655
return Stack(
651656
children: <Widget>[
652657
builder,
653-
if (specialPickerType != SpecialPickerType.wechatMoment ||
654-
asset.type != AssetType.video)
658+
if (!isWeChatMoment || asset.type != AssetType.video)
655659
selectIndicator(context, asset),
656660
],
657661
);
@@ -1108,13 +1112,21 @@ class DefaultAssetPickerBuilderDelegate
11081112
builder: (_, bool isSelectedNotEmpty, __) => GestureDetector(
11091113
onTap: isSelectedNotEmpty
11101114
? () async {
1115+
final List<AssetEntity> _selected;
1116+
if (isWeChatMoment) {
1117+
_selected = provider.selectedAssets
1118+
.where((AssetEntity e) => e.type == AssetType.image)
1119+
.toList();
1120+
} else {
1121+
_selected = provider.selectedAssets;
1122+
}
11111123
final List<AssetEntity>? result =
11121124
await AssetPickerViewer.pushToViewer(
11131125
context,
11141126
currentIndex: 0,
1115-
previewAssets: provider.selectedAssets,
1127+
previewAssets: _selected,
11161128
previewThumbSize: previewThumbSize,
1117-
selectedAssets: provider.selectedAssets,
1129+
selectedAssets: _selected,
11181130
selectorProvider: provider as DefaultAssetPickerProvider,
11191131
themeData: theme,
11201132
);
@@ -1232,22 +1244,41 @@ class DefaultAssetPickerBuilderDelegate
12321244
// When the special type is WeChat Moment, pictures and videos cannot
12331245
// be selected at the same time. Video select should be banned if any
12341246
// pictures are selected.
1235-
if (specialPickerType == SpecialPickerType.wechatMoment &&
1247+
if (isWeChatMoment &&
12361248
asset.type == AssetType.video &&
12371249
provider.selectedAssets.isNotEmpty) {
12381250
return;
12391251
}
1252+
final List<AssetEntity> _current;
1253+
final List<AssetEntity> _selected;
1254+
final int _index;
1255+
if (isWeChatMoment) {
1256+
if (asset.type == AssetType.video) {
1257+
_current = <AssetEntity>[asset];
1258+
_selected = <AssetEntity>[];
1259+
_index = 0;
1260+
} else {
1261+
_current = provider.currentAssets
1262+
.where((AssetEntity e) => e.type == AssetType.image)
1263+
.toList();
1264+
_selected = provider.selectedAssets;
1265+
_index = _current.indexOf(asset);
1266+
}
1267+
} else {
1268+
_current = provider.currentAssets;
1269+
_selected = provider.selectedAssets;
1270+
_index = index;
1271+
}
12401272
final List<AssetEntity>? result =
12411273
await AssetPickerViewer.pushToViewer(
12421274
context,
1243-
currentIndex: index,
1244-
previewAssets: provider.currentAssets,
1275+
currentIndex: _index,
1276+
previewAssets: _current,
12451277
themeData: theme,
12461278
previewThumbSize: previewThumbSize,
1247-
selectedAssets: provider.selectedAssets,
1279+
selectedAssets: _selected,
12481280
selectorProvider: provider as DefaultAssetPickerProvider,
1249-
specialPickerType:
1250-
asset.type == AssetType.video ? specialPickerType : null,
1281+
specialPickerType: specialPickerType,
12511282
);
12521283
if (result != null) {
12531284
Navigator.of(context).pop(result);

lib/src/delegates/asset_picker_viewer_builder_delegate.dart

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,11 @@ class DefaultAssetPickerViewerBuilderDelegate
248248
/// 详情部件是否显示
249249
final ValueNotifier<bool> isDisplayingDetail = ValueNotifier<bool>(true);
250250

251+
/// Whether the [SpecialPickerType.wechatMoment] is enabled.
252+
/// 当前是否为微信朋友圈选择模式
253+
bool get isWeChatMoment =>
254+
specialPickerType == SpecialPickerType.wechatMoment;
255+
251256
@override
252257
void initStateAndTicker(
253258
AssetPickerViewerState<AssetEntity, AssetPathEntity> s,
@@ -555,8 +560,7 @@ class DefaultAssetPickerViewerBuilderDelegate
555560
),
556561
const Spacer(),
557562
if (isAppleOS && provider != null) selectButton(context),
558-
if (!isAppleOS && provider != null ||
559-
specialPickerType == SpecialPickerType.wechatMoment)
563+
if (!isAppleOS && provider != null || isWeChatMoment)
560564
confirmButton(context),
561565
],
562566
),
@@ -576,14 +580,13 @@ class DefaultAssetPickerViewerBuilderDelegate
576580
child: Consumer<AssetPickerViewerProvider<AssetEntity>?>(
577581
builder: (_, AssetPickerViewerProvider<AssetEntity>? provider, __) {
578582
assert(
579-
specialPickerType == SpecialPickerType.wechatMoment ||
580-
provider != null,
583+
isWeChatMoment || provider != null,
581584
'Viewer provider must not be null'
582585
'when the special type is not WeChat moment.',
583586
);
584587
return MaterialButton(
585588
minWidth: () {
586-
if (specialPickerType == SpecialPickerType.wechatMoment) {
589+
if (isWeChatMoment) {
587590
return 48.0;
588591
}
589592
return provider!.isSelectedNotEmpty ? 48.0 : 20.0;
@@ -596,7 +599,7 @@ class DefaultAssetPickerViewerBuilderDelegate
596599
),
597600
child: Text(
598601
() {
599-
if (specialPickerType == SpecialPickerType.wechatMoment) {
602+
if (isWeChatMoment) {
600603
return Constants.textDelegate.confirm;
601604
}
602605
if (provider!.isSelectedNotEmpty) {
@@ -614,7 +617,7 @@ class DefaultAssetPickerViewerBuilderDelegate
614617
),
615618
),
616619
onPressed: () {
617-
if (specialPickerType == SpecialPickerType.wechatMoment) {
620+
if (isWeChatMoment) {
618621
Navigator.of(context).pop(<AssetEntity>[currentAsset]);
619622
return;
620623
}

0 commit comments

Comments
 (0)