Skip to content

Commit 6800dc6

Browse files
committed
♻️ Improve AssetPickerViewerBuilderDelegate's abstraction
1 parent ccdea25 commit 6800dc6

File tree

5 files changed

+51
-72
lines changed

5 files changed

+51
-72
lines changed

example/lib/customs/pickers/directory_file_asset_picker.dart

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1198,7 +1198,7 @@ class FileAssetPickerViewerBuilderDelegate
11981198
maxAssets: selectorProvider?.maxAssets,
11991199
);
12001200

1201-
bool isDisplayingDetail = true;
1201+
bool _isDisplayingDetail = true;
12021202

12031203
late final AnimationController _doubleTapAnimationController;
12041204
late final Animation<double> _doubleTapCurveAnimation;
@@ -1209,14 +1209,16 @@ class FileAssetPickerViewerBuilderDelegate
12091209

12101210
AssetsPickerTextDelegate get textDelegate => AssetsPickerTextDelegate();
12111211

1212+
@override
12121213
void switchDisplayingDetail({bool? value}) {
1213-
isDisplayingDetail = value ?? !isDisplayingDetail;
1214+
_isDisplayingDetail = value ?? !_isDisplayingDetail;
12141215
if (viewerState.mounted) {
12151216
// ignore: invalid_use_of_protected_member
12161217
viewerState.setState(() {});
12171218
}
12181219
}
12191220

1221+
@override
12201222
void updateAnimation(ExtendedImageGestureState state) {
12211223
final double begin = state.gestureDetails!.totalScale!;
12221224
final double end = state.gestureDetails!.totalScale! == 1.0 ? 3.0 : 1.0;
@@ -1240,13 +1242,6 @@ class FileAssetPickerViewerBuilderDelegate
12401242
_doubleTapAnimationController.forward();
12411243
}
12421244

1243-
Future<bool> syncSelectedAssetsWhenPop() async {
1244-
if (provider?.currentlySelectedAssets != null) {
1245-
selectorProvider?.selectedAssets = provider!.currentlySelectedAssets;
1246-
}
1247-
return true;
1248-
}
1249-
12501245
@override
12511246
Widget assetPageBuilder(BuildContext context, int index) {
12521247
final File asset = previewAssets.elementAt(index);
@@ -1281,7 +1276,7 @@ class FileAssetPickerViewerBuilderDelegate
12811276
return AnimatedPositioned(
12821277
duration: kThemeAnimationDuration,
12831278
curve: Curves.easeInOut,
1284-
bottom: isDisplayingDetail
1279+
bottom: _isDisplayingDetail
12851280
? 0.0
12861281
: -(Screens.bottomSafeHeight + bottomDetailHeight),
12871282
left: 0.0,
@@ -1395,7 +1390,7 @@ class FileAssetPickerViewerBuilderDelegate
13951390
return AnimatedPositioned(
13961391
duration: kThemeAnimationDuration,
13971392
curve: Curves.easeInOut,
1398-
top: isDisplayingDetail ? 0.0 : -(Screens.topSafeHeight + kToolbarHeight),
1393+
top: _isDisplayingDetail ? 0.0 : -(Screens.topSafeHeight + kToolbarHeight),
13991394
left: 0.0,
14001395
right: 0.0,
14011396
height: Screens.topSafeHeight + kToolbarHeight,

lib/src/delegates/asset_picker_viewer_builder_delegate.dart

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ abstract class AssetPickerViewerBuilderDelegate<Asset, Path> {
6060
/// 正在预览的资源的 [ScrollController]
6161
final ScrollController previewingListController = ScrollController();
6262

63+
/// Whether detail widgets displayed.
64+
/// 详情部件是否显示
65+
final ValueNotifier<bool> isDisplayingDetail = ValueNotifier<bool>(true);
66+
6367
/// The [State] for a viewer.
6468
/// 预览器的状态实例
6569
late final AssetPickerViewerState<Asset, Path> viewerState;
@@ -115,8 +119,13 @@ abstract class AssetPickerViewerBuilderDelegate<Asset, Path> {
115119
pageStreamController.close();
116120
previewingListController.dispose();
117121
selectedNotifier.dispose();
122+
isDisplayingDetail.dispose();
118123
}
119124

125+
/// Execute scale animation when double tap.
126+
/// 双击时执行缩放动画
127+
void updateAnimation(ExtendedImageGestureState state);
128+
120129
/// The length getter for selected assets currently.
121130
/// 当前选中的资源的长度获取
122131
int get selectedCount => selectedAssets?.length ?? 0;
@@ -154,6 +163,21 @@ abstract class AssetPickerViewerBuilderDelegate<Asset, Path> {
154163
}
155164
}
156165

166+
/// Method to switch [isDisplayingDetail].
167+
/// 切换显示详情状态的方法
168+
void switchDisplayingDetail({bool? value}) {
169+
isDisplayingDetail.value = value ?? !isDisplayingDetail.value;
170+
}
171+
172+
/// Sync selected assets currently with asset picker provider.
173+
/// 在预览中当前已选的图片同步到选择器的状态
174+
Future<bool> syncSelectedAssetsWhenPop() async {
175+
if (provider?.currentlySelectedAssets != null) {
176+
selectorProvider?.selectedAssets = provider!.currentlySelectedAssets;
177+
}
178+
return true;
179+
}
180+
157181
/// Split page builder according to type of asset.
158182
/// 根据资源类型使用不同的构建页
159183
Widget assetPageBuilder(BuildContext context, int index);
@@ -270,10 +294,6 @@ class DefaultAssetPickerViewerBuilderDelegate
270294
late final PageController pageController =
271295
PageController(initialPage: currentIndex);
272296

273-
/// Whether detail widgets displayed.
274-
/// 详情部件是否显示
275-
final ValueNotifier<bool> isDisplayingDetail = ValueNotifier<bool>(true);
276-
277297
/// Whether the [SpecialPickerType.wechatMoment] is enabled.
278298
/// 当前是否为微信朋友圈选择模式
279299
bool get isWeChatMoment =>
@@ -309,8 +329,7 @@ class DefaultAssetPickerViewerBuilderDelegate
309329
super.dispose();
310330
}
311331

312-
/// Execute scale animation when double tap.
313-
/// 双击时执行缩放动画
332+
@override
314333
void updateAnimation(ExtendedImageGestureState state) {
315334
final double begin = state.gestureDetails!.totalScale!;
316335
final double end = state.gestureDetails!.totalScale! == 1.0 ? 3.0 : 1.0;
@@ -334,52 +353,35 @@ class DefaultAssetPickerViewerBuilderDelegate
334353
_doubleTapAnimationController.forward();
335354
}
336355

337-
/// Method to switch [isDisplayingDetail].
338-
/// 切换显示详情状态的方法
339-
void switchDisplayingDetail({bool? value}) {
340-
isDisplayingDetail.value = value ?? !isDisplayingDetail.value;
341-
}
342-
343-
/// Sync selected assets currently with asset picker provider.
344-
/// 在预览中当前已选的图片同步到选择器的状态
345-
Future<bool> syncSelectedAssetsWhenPop() async {
346-
if (provider?.currentlySelectedAssets != null) {
347-
selectorProvider?.selectedAssets = provider!.currentlySelectedAssets;
348-
}
349-
return true;
350-
}
351-
352356
@override
353357
Widget assetPageBuilder(BuildContext context, int index) {
354358
final AssetEntity asset = previewAssets.elementAt(index);
355-
Widget builder;
359+
Widget _builder;
356360
switch (asset.type) {
357361
case AssetType.audio:
358-
builder = AudioPageBuilder(asset: asset, state: viewerState);
362+
_builder = AudioPageBuilder(asset: asset);
359363
break;
360364
case AssetType.image:
361-
builder = ImagePageBuilder(
365+
_builder = ImagePageBuilder(
362366
asset: asset,
363-
state: viewerState,
367+
delegate: this,
364368
previewThumbSize: previewThumbSize,
365369
);
366370
break;
367371
case AssetType.video:
368-
builder = VideoPageBuilder(
372+
_builder = VideoPageBuilder(
369373
asset: asset,
370-
state: viewerState,
374+
delegate: this,
371375
hasOnlyOneVideoAndMoment: isWeChatMoment && hasVideo,
372376
);
373377
break;
374378
case AssetType.other:
375-
builder = Center(
376-
child: ScaleText(
377-
Constants.textDelegate.unSupportedAssetType,
378-
),
379+
_builder = Center(
380+
child: ScaleText(Constants.textDelegate.unSupportedAssetType),
379381
);
380382
break;
381383
}
382-
return builder;
384+
return _builder;
383385
}
384386

385387
/// Preview item widgets for audios.

lib/src/widget/builder/audio_page_builder.dart

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,12 @@ import '../../../src/constants/constants.dart';
1010
import '../scale_text.dart';
1111

1212
class AudioPageBuilder extends StatefulWidget {
13-
const AudioPageBuilder({
14-
Key? key,
15-
required this.asset,
16-
required this.state,
17-
}) : super(key: key);
13+
const AudioPageBuilder({Key? key, required this.asset}) : super(key: key);
1814

1915
/// Asset currently displayed.
2016
/// 展示的资源
2117
final AssetEntity asset;
2218

23-
/// [State] for asset picker viewer.
24-
/// 资源查看器的状态 [State]
25-
final AssetPickerViewerState<AssetEntity, AssetPathEntity> state;
26-
2719
@override
2820
State<StatefulWidget> createState() => _AudioPageBuilderState();
2921
}

lib/src/widget/builder/image_page_builder.dart

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,15 @@ class ImagePageBuilder extends StatefulWidget {
1212
const ImagePageBuilder({
1313
Key? key,
1414
required this.asset,
15-
required this.state,
15+
required this.delegate,
1616
this.previewThumbSize,
1717
}) : super(key: key);
1818

1919
/// Asset currently displayed.
2020
/// 展示的资源
2121
final AssetEntity asset;
2222

23-
/// [State] for asset picker viewer.
24-
/// 资源查看器的状态[State]
25-
final AssetPickerViewerState<AssetEntity, AssetPathEntity> state;
23+
final AssetPickerViewerBuilderDelegate<AssetEntity, AssetPathEntity> delegate;
2624

2725
final List<int>? previewThumbSize;
2826

@@ -31,9 +29,6 @@ class ImagePageBuilder extends StatefulWidget {
3129
}
3230

3331
class _ImagePageBuilderState extends State<ImagePageBuilder> {
34-
DefaultAssetPickerViewerBuilderDelegate get builder =>
35-
widget.state.builder as DefaultAssetPickerViewerBuilderDelegate;
36-
3732
@override
3833
Widget build(BuildContext context) {
3934
return LocallyAvailableBuilder(
@@ -42,7 +37,7 @@ class _ImagePageBuilderState extends State<ImagePageBuilder> {
4237
builder: (BuildContext context, AssetEntity asset) {
4338
return GestureDetector(
4439
behavior: HitTestBehavior.opaque,
45-
onTap: builder.switchDisplayingDetail,
40+
onTap: widget.delegate.switchDisplayingDetail,
4641
child: ExtendedImage(
4742
image: AssetEntityImageProvider(
4843
asset,
@@ -51,7 +46,7 @@ class _ImagePageBuilderState extends State<ImagePageBuilder> {
5146
),
5247
fit: BoxFit.contain,
5348
mode: ExtendedImageMode.gesture,
54-
onDoubleTap: builder.updateAnimation,
49+
onDoubleTap: widget.delegate.updateAnimation,
5550
initGestureConfigHandler: (ExtendedImageState state) {
5651
return GestureConfig(
5752
initialScale: 1.0,
@@ -64,7 +59,7 @@ class _ImagePageBuilderState extends State<ImagePageBuilder> {
6459
);
6560
},
6661
loadStateChanged: (ExtendedImageState state) {
67-
return builder.previewWidgetLoadStateChanged(
62+
return widget.delegate.previewWidgetLoadStateChanged(
6863
context,
6964
state,
7065
hasLoaded: state.extendedImageLoadState == LoadState.completed,

lib/src/widget/builder/video_page_builder.dart

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,15 @@ class VideoPageBuilder extends StatefulWidget {
1313
const VideoPageBuilder({
1414
Key? key,
1515
required this.asset,
16-
required this.state,
16+
required this.delegate,
1717
this.hasOnlyOneVideoAndMoment = false,
1818
}) : super(key: key);
1919

2020
/// Asset currently displayed.
2121
/// 展示的资源
2222
final AssetEntity asset;
2323

24-
/// [State] for asset picker viewer.
25-
/// 资源查看器的状态 [State]
26-
final AssetPickerViewerState<AssetEntity, AssetPathEntity> state;
24+
final AssetPickerViewerBuilderDelegate<AssetEntity, AssetPathEntity> delegate;
2725

2826
/// Only previewing one video and with the [SpecialPickerType.wechatMoment].
2927
/// 是否处于 [SpecialPickerType.wechatMoment] 且只有一个视频
@@ -54,9 +52,6 @@ class _VideoPageBuilderState extends State<VideoPageBuilder> {
5452
/// 播放控制器是否在播放
5553
bool get isControllerPlaying => _controller.value.isPlaying;
5654

57-
DefaultAssetPickerViewerBuilderDelegate get builder =>
58-
widget.state.builder as DefaultAssetPickerViewerBuilderDelegate;
59-
6055
@override
6156
void initState() {
6257
super.initState();
@@ -122,8 +117,8 @@ class _VideoPageBuilderState extends State<VideoPageBuilder> {
122117
if (isPlaying.value) {
123118
_controller.pause();
124119
} else {
125-
if (builder.isDisplayingDetail.value) {
126-
builder.switchDisplayingDetail(value: false);
120+
if (widget.delegate.isDisplayingDetail.value) {
121+
widget.delegate.switchDisplayingDetail(value: false);
127122
}
128123
if (_controller.value.duration == _controller.value.position) {
129124
_controller
@@ -164,7 +159,7 @@ class _VideoPageBuilderState extends State<VideoPageBuilder> {
164159
behavior: HitTestBehavior.opaque,
165160
onTap: value
166161
? playButtonCallback
167-
: builder.switchDisplayingDetail,
162+
: widget.delegate.switchDisplayingDetail,
168163
child: Center(
169164
child: AnimatedOpacity(
170165
duration: kThemeAnimationDuration,

0 commit comments

Comments
 (0)