asset_picker_viewer.dart
4.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// Copyright 2019 The FlutterCandies author. All rights reserved.
// Use of this source code is governed by an Apache license that can be found
// in the LICENSE file.
import 'dart:async';
import 'package:flutter/material.dart' hide Path;
import 'package:photo_manager/photo_manager.dart';
import '../constants/constants.dart';
import '../constants/enums.dart';
import '../constants/typedefs.dart';
import '../delegates/asset_picker_viewer_builder_delegate.dart';
import '../provider/asset_picker_provider.dart';
import '../provider/asset_picker_viewer_provider.dart';
import 'asset_picker.dart';
import 'asset_picker_page_route.dart';
class AssetPickerViewer<Asset, Path> extends StatefulWidget {
const AssetPickerViewer({
super.key,
required this.builder,
});
final AssetPickerViewerBuilderDelegate<Asset, Path> builder;
@override
AssetPickerViewerState<Asset, Path> createState() =>
AssetPickerViewerState<Asset, Path>();
/// Static method to push with the navigator.
/// 跳转至选择预览的静态方法
static Future<List<AssetEntity>?> pushToViewer(
BuildContext context, {
int currentIndex = 0,
required List<AssetEntity> previewAssets,
required ThemeData themeData,
DefaultAssetPickerProvider? selectorProvider,
ThumbnailSize? previewThumbnailSize,
List<AssetEntity>? selectedAssets,
SpecialPickerType? specialPickerType,
int? maxAssets,
bool shouldReversePreview = false,
AssetSelectPredicate<AssetEntity>? selectPredicate,
PermissionRequestOption permissionRequestOption =
const PermissionRequestOption(),
bool shouldAutoplayPreview = false,
bool useRootNavigator = false,
RouteSettings? pageRouteSettings,
AssetPickerViewerPageRouteBuilder<List<AssetEntity>>? pageRouteBuilder,
}) async {
if (previewAssets.isEmpty) {
throw StateError('Previewing empty assets is not allowed.');
}
await AssetPicker.permissionCheck(requestOption: permissionRequestOption);
final Widget viewer = AssetPickerViewer<AssetEntity, AssetPathEntity>(
builder: DefaultAssetPickerViewerBuilderDelegate(
currentIndex: currentIndex,
previewAssets: previewAssets,
provider: selectedAssets != null
? AssetPickerViewerProvider<AssetEntity>(
selectedAssets,
maxAssets: maxAssets ??
selectorProvider?.maxAssets ??
defaultMaxAssetsCount,
)
: null,
themeData: themeData,
previewThumbnailSize: previewThumbnailSize,
specialPickerType: specialPickerType,
selectedAssets: selectedAssets,
selectorProvider: selectorProvider,
maxAssets: maxAssets,
shouldReversePreview: shouldReversePreview,
selectPredicate: selectPredicate,
shouldAutoplayPreview: shouldAutoplayPreview,
),
);
final List<AssetEntity>? result = await Navigator.maybeOf(
context,
rootNavigator: useRootNavigator,
)?.push<List<AssetEntity>>(
pageRouteBuilder?.call(viewer) ??
AssetPickerViewerPageRoute(builder: (context) => viewer),
);
return result;
}
/// Call the viewer with provided delegate and provider.
/// 通过指定的 [delegate] 调用查看器
static Future<List<A>?> pushToViewerWithDelegate<A, P>(
BuildContext context, {
required AssetPickerViewerBuilderDelegate<A, P> delegate,
PermissionRequestOption permissionRequestOption =
const PermissionRequestOption(),
bool useRootNavigator = false,
RouteSettings? pageRouteSettings,
AssetPickerViewerPageRouteBuilder<List<A>>? pageRouteBuilder,
}) async {
await AssetPicker.permissionCheck(requestOption: permissionRequestOption);
final Widget viewer = AssetPickerViewer<A, P>(builder: delegate);
final List<A>? result = await Navigator.maybeOf(
context,
rootNavigator: useRootNavigator,
)?.push<List<A>>(
pageRouteBuilder?.call(viewer) ??
AssetPickerViewerPageRoute(builder: (context) => viewer),
);
return result;
}
}
class AssetPickerViewerState<Asset, Path>
extends State<AssetPickerViewer<Asset, Path>>
with TickerProviderStateMixin {
AssetPickerViewerBuilderDelegate<Asset, Path> get builder => widget.builder;
@override
void initState() {
super.initState();
builder.initStateAndTicker(this, this);
}
@override
void didUpdateWidget(covariant AssetPickerViewer<Asset, Path> oldWidget) {
super.didUpdateWidget(oldWidget);
builder.didUpdateViewer(this, oldWidget, widget);
}
@override
void dispose() {
builder.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return builder.build(context);
}
}