Skip to content

Commit 35f98a0

Browse files
authored
✨ Add full semantics support (#232)
1 parent 2055adf commit 35f98a0

11 files changed

+957
-570
lines changed

example/lib/constants/picker_method.dart

Lines changed: 44 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -80,19 +80,25 @@ class PickMethod {
8080
requestType: RequestType.common,
8181
specialItemPosition: SpecialItemPosition.prepend,
8282
specialItemBuilder: (BuildContext context) {
83-
return GestureDetector(
84-
behavior: HitTestBehavior.opaque,
85-
onTap: () async {
86-
final AssetEntity? result = await CameraPicker.pickFromCamera(
87-
context,
88-
enableRecording: true,
89-
);
90-
if (result != null) {
91-
handleResult(context, result);
92-
}
93-
},
94-
child: const Center(
95-
child: Icon(Icons.camera_enhance, size: 42.0),
83+
return Semantics(
84+
label: AssetsPickerTextDelegate().sActionUseCameraHint,
85+
button: true,
86+
onTapHint: AssetsPickerTextDelegate().sActionUseCameraHint,
87+
child: GestureDetector(
88+
behavior: HitTestBehavior.opaque,
89+
onTap: () async {
90+
Feedback.forTap(context);
91+
final AssetEntity? result = await CameraPicker.pickFromCamera(
92+
context,
93+
enableRecording: true,
94+
);
95+
if (result != null) {
96+
handleResult(context, result);
97+
}
98+
},
99+
child: const Center(
100+
child: Icon(Icons.camera_enhance, size: 42.0),
101+
),
96102
),
97103
);
98104
},
@@ -115,26 +121,31 @@ class PickMethod {
115121
requestType: RequestType.common,
116122
specialItemPosition: SpecialItemPosition.prepend,
117123
specialItemBuilder: (BuildContext context) {
118-
return GestureDetector(
119-
behavior: HitTestBehavior.opaque,
120-
onTap: () async {
121-
final AssetEntity? result = await CameraPicker.pickFromCamera(
122-
context,
123-
enableRecording: true,
124-
);
125-
if (result == null) {
126-
return;
127-
}
128-
final AssetPicker<AssetEntity, AssetPathEntity> picker =
129-
context.findAncestorWidgetOfExactType()!;
130-
final DefaultAssetPickerProvider p =
131-
picker.builder.provider as DefaultAssetPickerProvider;
132-
await p.currentPathEntity!.refreshPathProperties();
133-
await p.switchPath(p.currentPathEntity!);
134-
p.selectAsset(result);
135-
},
136-
child: const Center(
137-
child: Icon(Icons.camera_enhance, size: 42.0),
124+
return Semantics(
125+
label: AssetsPickerTextDelegate().sActionUseCameraHint,
126+
button: true,
127+
onTapHint: AssetsPickerTextDelegate().sActionUseCameraHint,
128+
child: GestureDetector(
129+
behavior: HitTestBehavior.opaque,
130+
onTap: () async {
131+
final AssetEntity? result = await CameraPicker.pickFromCamera(
132+
context,
133+
enableRecording: true,
134+
);
135+
if (result == null) {
136+
return;
137+
}
138+
final AssetPicker<AssetEntity, AssetPathEntity> picker =
139+
context.findAncestorWidgetOfExactType()!;
140+
final DefaultAssetPickerProvider p =
141+
picker.builder.provider as DefaultAssetPickerProvider;
142+
await p.currentPathEntity!.refreshPathProperties();
143+
await p.switchPath(p.currentPathEntity!);
144+
p.selectAsset(result);
145+
},
146+
child: const Center(
147+
child: Icon(Icons.camera_enhance, size: 42.0),
148+
),
138149
),
139150
);
140151
},

example/lib/customs/pickers/directory_file_asset_picker.dart

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -379,8 +379,6 @@ class FileAssetPickerBuilder
379379
required FileAssetPickerProvider provider,
380380
}) : super(provider: provider, initialPermission: PermissionState.authorized);
381381

382-
AssetsPickerTextDelegate get textDelegate => AssetsPickerTextDelegate();
383-
384382
Duration get switchingPathDuration => kThemeAnimationDuration * 1.5;
385383

386384
Curve get switchingPathCurve => Curves.easeInOut;
@@ -424,6 +422,18 @@ class FileAssetPickerBuilder
424422
return Navigator.of(context).push<List<File>?>(pageRoute);
425423
}
426424

425+
@override
426+
void selectAsset(BuildContext context, File asset, bool selected) {
427+
if (selected) {
428+
provider.unSelectAsset(asset);
429+
} else {
430+
if (isSingleAssetMode) {
431+
provider.selectedAssets.clear();
432+
}
433+
provider.selectAsset(asset);
434+
}
435+
}
436+
427437
@override
428438
Widget androidLayout(BuildContext context) {
429439
return Scaffold(
@@ -669,11 +679,21 @@ class FileAssetPickerBuilder
669679
fit: StackFit.expand,
670680
children: <Widget>[
671681
Positioned.fill(child: builder),
672-
selectIndicator(context, asset),
682+
selectIndicator(context, index, asset),
673683
],
674684
);
675685
}
676686

687+
@override
688+
Semantics assetGridItemSemanticsBuilder(
689+
BuildContext context,
690+
int index,
691+
File asset,
692+
Widget child,
693+
) {
694+
return Semantics(child: child);
695+
}
696+
677697
@override
678698
int assetsGridItemCount({
679699
required BuildContext context,
@@ -1050,16 +1070,12 @@ class FileAssetPickerBuilder
10501070
}
10511071

10521072
@override
1053-
Widget selectIndicator(BuildContext context, File asset) {
1073+
Widget selectIndicator(BuildContext context, int index, File asset) {
10541074
return Selector<FileAssetPickerProvider, List<File>>(
10551075
selector: (_, FileAssetPickerProvider p) => p.selectedAssets,
10561076
builder: (_, List<File> selectedAssets, __) {
10571077
final bool isSelected =
10581078
selectedAssets.where((File f) => f.path == asset.path).isNotEmpty;
1059-
int index = 0;
1060-
if (isSelected) {
1061-
index = selectedAssets.indexWhere((File f) => f.path == asset.path);
1062-
}
10631079
final double indicatorSize = Screens.width / gridCount / 3;
10641080
return Positioned(
10651081
top: 0.0,
@@ -1200,8 +1216,6 @@ class FileAssetPickerViewerBuilderDelegate
12001216

12011217
bool _isDisplayingDetail = true;
12021218

1203-
AssetsPickerTextDelegate get textDelegate => AssetsPickerTextDelegate();
1204-
12051219
@override
12061220
void switchDisplayingDetail({bool? value}) {
12071221
_isDisplayingDetail = value ?? !_isDisplayingDetail;

example/lib/main.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import 'package:flutter/material.dart';
66
import 'package:flutter/services.dart';
77
import 'package:flutter_localizations/flutter_localizations.dart';
8-
import 'package:package_info_plus/package_info_plus.dart';
98
import 'package:wechat_assets_picker/wechat_assets_picker.dart';
109

1110
import 'constants/extensions.dart';
@@ -14,7 +13,7 @@ import 'pages/splash_page.dart';
1413

1514
const Color themeColor = Color(0xff00bc56);
1615

17-
PackageInfo? packageInfo;
16+
String? packageVersion;
1817

1918
void main() {
2019
runApp(MyApp());

example/lib/pages/home_page.dart

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
/// [Date] 2020-05-31 21:38
44
///
55
import 'package:flutter/material.dart';
6+
import 'package:flutter/semantics.dart';
67
import 'package:flutter/services.dart';
78

89
import '../constants/screens.dart';
@@ -71,16 +72,19 @@ class _HomePageState extends State<HomePage> {
7172
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
7273
crossAxisAlignment: CrossAxisAlignment.start,
7374
children: <Widget>[
74-
const Text(
75-
'WeChat Asset Picker',
76-
style: TextStyle(
77-
fontSize: 18.0,
78-
fontWeight: FontWeight.bold,
75+
Semantics(
76+
sortKey: const OrdinalSortKey(0),
77+
child: Text(
78+
'WeChat Asset Picker',
79+
style: Theme.of(context).textTheme.headline6,
7980
),
8081
),
81-
Text(
82-
packageInfo == null ? 'Unknown version' : packageInfo!.version,
83-
style: Theme.of(context).textTheme.caption,
82+
Semantics(
83+
sortKey: const OrdinalSortKey(0.1),
84+
child: Text(
85+
'Version: ${packageVersion ?? 'unknown'}',
86+
style: Theme.of(context).textTheme.caption,
87+
),
8488
),
8589
],
8690
),

example/lib/pages/splash_page.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ class _SplashPageState extends State<SplashPage> {
2424

2525
Future<void> init() async {
2626
await PackageInfo.fromPlatform()
27-
.then((PackageInfo p) => packageInfo = p)
27+
.then((PackageInfo p) => packageVersion = p.version)
2828
.catchError((Object _) {});
29-
await Future<void>.delayed(const Duration(seconds: 2));
29+
await Future<void>.delayed(const Duration(seconds: 1));
3030
if (mounted) {
3131
Navigator.of(context).pushReplacement(
3232
PageRouteBuilder<void>(

0 commit comments

Comments
 (0)