Skip to content

Commit b72dd43

Browse files
committed
♻️ Abstract more fields in the example
1 parent 34841fa commit b72dd43

12 files changed

+491
-706
lines changed

example/lib/constants/extensions.dart

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,7 @@
44
///
55
import 'package:flutter/material.dart';
66

7-
extension BrightnessExtension on Brightness {
8-
bool get isDark => this == Brightness.dark;
9-
bool get isLight => this == Brightness.light;
10-
}
11-
12-
extension BuildContextExtension on BuildContext {
13-
MediaQueryData get mediaQuery => MediaQuery.of(this);
14-
ThemeData get themeData => Theme.of(this);
15-
}
16-
177
extension ColorExtension on Color {
18-
bool get isTransparent => this == Colors.transparent;
19-
208
MaterialColor get swatch => Colors.primaries.firstWhere(
219
(Color c) => c.value == value,
2210
orElse: () => _swatch,

example/lib/constants/page_mixin.dart

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
///
2+
/// [Author] Alex (https://github.com/AlexV525)
3+
/// [Date] 2021/7/13 11:46
4+
///
5+
import 'package:flutter/foundation.dart';
6+
import 'package:flutter/widgets.dart';
7+
import 'package:wechat_assets_picker/wechat_assets_picker.dart';
8+
9+
import '../widgets/method_list.dart';
10+
import '../widgets/selected_assets_list.dart';
11+
import 'picker_method.dart';
12+
13+
@optionalTypeArgs
14+
mixin ExamplePageMixin<T extends StatefulWidget> on State<T> {
15+
final ValueNotifier<bool> isDisplayingDetail = ValueNotifier<bool>(true);
16+
17+
@override
18+
void dispose() {
19+
isDisplayingDetail.dispose();
20+
super.dispose();
21+
}
22+
23+
int get maxAssetsCount;
24+
25+
List<AssetEntity> assets = <AssetEntity>[];
26+
27+
int get assetsLength => assets.length;
28+
29+
List<PickMethod> get pickMethods;
30+
31+
/// These fields are for the keep scroll position feature.
32+
late DefaultAssetPickerProvider keepScrollProvider =
33+
DefaultAssetPickerProvider();
34+
DefaultAssetPickerBuilderDelegate? keepScrollDelegate;
35+
36+
Future<void> selectAssets(PickMethod model) async {
37+
final List<AssetEntity>? result = await model.method(context, assets);
38+
if (result != null) {
39+
assets = List<AssetEntity>.from(result);
40+
if (mounted) {
41+
setState(() {});
42+
}
43+
}
44+
}
45+
46+
void removeAsset(int index) {
47+
assets.removeAt(index);
48+
if (assets.isEmpty) {
49+
isDisplayingDetail.value = false;
50+
}
51+
setState(() {});
52+
}
53+
54+
void onResult(List<AssetEntity>? result) {
55+
if (result != null && result != assets) {
56+
assets = List<AssetEntity>.from(result);
57+
if (mounted) {
58+
setState(() {});
59+
}
60+
}
61+
}
62+
63+
@override
64+
@mustCallSuper
65+
Widget build(BuildContext context) {
66+
super.build(context);
67+
return Column(
68+
children: <Widget>[
69+
Expanded(
70+
child: MethodList(
71+
pickMethods: pickMethods,
72+
onSelectMethod: selectAssets,
73+
),
74+
),
75+
if (assets.isNotEmpty)
76+
SelectedAssetsList(
77+
assets: assets,
78+
isDisplayingDetail: isDisplayingDetail,
79+
onResult: onResult,
80+
onRemoveAsset: removeAsset,
81+
),
82+
],
83+
);
84+
}
85+
}

example/lib/constants/picker_method.dart

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ class PickMethod {
1212
required this.name,
1313
required this.description,
1414
required this.method,
15+
this.onLongPress,
1516
});
1617

1718
factory PickMethod.image(int maxAssetsCount) {
@@ -248,11 +249,12 @@ class PickMethod {
248249
);
249250
}
250251

251-
factory PickMethod.keepScrollOffset(
252-
DefaultAssetPickerProvider provider,
253-
DefaultAssetPickerBuilderDelegate Function() delegate,
254-
Function(PermissionState state) onPermission,
255-
) {
252+
factory PickMethod.keepScrollOffset({
253+
required DefaultAssetPickerProvider Function() provider,
254+
required DefaultAssetPickerBuilderDelegate Function() delegate,
255+
required Function(PermissionState state) onPermission,
256+
GestureLongPressCallback? onLongPress,
257+
}) {
256258
return PickMethod(
257259
icon: '💾',
258260
name: 'Keep scroll offset',
@@ -267,10 +269,11 @@ class PickMethod {
267269
onPermission(_ps);
268270
return AssetPicker.pickAssetsWithDelegate(
269271
context,
270-
provider: provider,
272+
provider: provider(),
271273
delegate: delegate(),
272274
);
273275
},
276+
onLongPress: onLongPress,
274277
);
275278
}
276279

@@ -281,4 +284,5 @@ class PickMethod {
281284
BuildContext context,
282285
List<AssetEntity> selectedAssets,
283286
) method;
287+
final GestureLongPressCallback? onLongPress;
284288
}

example/lib/customs/custom_picker_page.dart

Lines changed: 38 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@
33
/// [Date] 2020-11-01 02:05
44
///
55
import 'package:flutter/material.dart';
6-
import 'package:wechat_assets_picker_demo/customs/pickers/directory_file_asset_picker.dart';
76

87
import '../constants/custom_pick_method.dart';
9-
import '../constants/extensions.dart';
8+
import 'pickers/directory_file_asset_picker.dart';
109

1110
class CustomPickersPage extends StatefulWidget {
1211
@override
@@ -15,7 +14,16 @@ class CustomPickersPage extends StatefulWidget {
1514

1615
class _CustomPickerPageState extends State<CustomPickersPage>
1716
with AutomaticKeepAliveClientMixin {
18-
ThemeData get currentTheme => context.themeData;
17+
Widget get tips {
18+
return const Padding(
19+
padding: EdgeInsets.all(20.0),
20+
child: Text(
21+
'This page contains customized pickers with different asset types, '
22+
'different UI layouts, or some use case for specific apps. '
23+
'Contribute to add your custom picker are welcomed.',
24+
),
25+
);
26+
}
1927

2028
List<CustomPickMethod> get pickMethods {
2129
return <CustomPickMethod>[
@@ -34,7 +42,27 @@ class _CustomPickerPageState extends State<CustomPickersPage>
3442
];
3543
}
3644

37-
Widget methodItemBuilder(BuildContext _, int index) {
45+
@override
46+
bool get wantKeepAlive => true;
47+
48+
@override
49+
Widget build(BuildContext context) {
50+
super.build(context);
51+
return Column(
52+
children: <Widget>[tips, _MethodListView(pickMethods: pickMethods)],
53+
);
54+
}
55+
}
56+
57+
class _MethodListView extends StatelessWidget {
58+
const _MethodListView({
59+
Key? key,
60+
required this.pickMethods,
61+
}) : super(key: key);
62+
63+
final List<CustomPickMethod> pickMethods;
64+
65+
Widget methodItemBuilder(BuildContext context, int index) {
3866
final CustomPickMethod model = pickMethods[index];
3967
return InkWell(
4068
onTap: () => model.method(context),
@@ -72,7 +100,7 @@ class _CustomPickerPageState extends State<CustomPickersPage>
72100
const SizedBox(height: 5),
73101
Text(
74102
model.description,
75-
style: context.themeData.textTheme.caption,
103+
style: Theme.of(context).textTheme.caption,
76104
overflow: TextOverflow.fade,
77105
),
78106
],
@@ -85,33 +113,12 @@ class _CustomPickerPageState extends State<CustomPickersPage>
85113
);
86114
}
87115

88-
Widget get methodListView {
89-
return Expanded(
90-
child: ListView.builder(
91-
padding: const EdgeInsets.symmetric(vertical: 10.0),
92-
itemCount: pickMethods.length,
93-
itemBuilder: methodItemBuilder,
94-
),
95-
);
96-
}
97-
98-
Widget get tips {
99-
return const Padding(
100-
padding: EdgeInsets.all(20.0),
101-
child: Text(
102-
'This page contains customized pickers with different asset types, '
103-
'different UI layouts, or some use case for specific apps. '
104-
'Contribute to add your custom picker are welcomed.',
105-
),
106-
);
107-
}
108-
109-
@override
110-
bool get wantKeepAlive => true;
111-
112116
@override
113117
Widget build(BuildContext context) {
114-
super.build(context);
115-
return Column(children: <Widget>[tips, methodListView]);
118+
return ListView.builder(
119+
padding: const EdgeInsets.symmetric(vertical: 10.0),
120+
itemCount: pickMethods.length,
121+
itemBuilder: methodItemBuilder,
122+
);
116123
}
117124
}

example/lib/main.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ import 'pages/splash_page.dart';
1414

1515
const Color themeColor = Color(0xff00bc56);
1616

17-
bool get currentIsDark => Screens.mediaQuery.platformBrightness.isDark;
18-
1917
PackageInfo? packageInfo;
2018

2119
void main() {

example/lib/pages/home_page.dart

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55
import 'package:flutter/material.dart';
66
import 'package:flutter/services.dart';
77

8-
import '../constants/extensions.dart';
98
import '../constants/screens.dart';
109
import '../customs/custom_picker_page.dart';
1110
import '../main.dart';
1211
import 'multi_assets_page.dart';
1312
import 'single_assets_page.dart';
1413

14+
bool get currentIsDark =>
15+
Screens.mediaQuery.platformBrightness == Brightness.dark;
16+
1517
class HomePage extends StatefulWidget {
1618
const HomePage({Key? key}) : super(key: key);
1719

@@ -50,7 +52,7 @@ class _HomePageState extends State<HomePage> {
5052
}
5153
}
5254

53-
Widget get header {
55+
Widget header(BuildContext context) {
5456
return Container(
5557
margin: const EdgeInsetsDirectional.only(top: 30.0),
5658
height: 60.0,
@@ -78,7 +80,7 @@ class _HomePageState extends State<HomePage> {
7880
),
7981
Text(
8082
packageInfo == null ? 'Unknown version' : packageInfo!.version,
81-
style: context.themeData.textTheme.caption,
83+
style: Theme.of(context).textTheme.caption,
8284
),
8385
],
8486
),
@@ -91,14 +93,14 @@ class _HomePageState extends State<HomePage> {
9193
@override
9294
Widget build(BuildContext context) {
9395
return AnnotatedRegion<SystemUiOverlayStyle>(
94-
value: Screens.mediaQuery.platformBrightness.isDark
96+
value: currentIsDark
9597
? SystemUiOverlayStyle.light
9698
: SystemUiOverlayStyle.dark,
9799
child: Scaffold(
98100
body: SafeArea(
99101
child: Column(
100102
children: <Widget>[
101-
header,
103+
header(context),
102104
Expanded(
103105
child: PageView(
104106
controller: controller,

0 commit comments

Comments
 (0)