Skip to content

Commit e0dff1e

Browse files
a11y: Ensure {,Sub}MenuItemButtons have SemanticsRole.menu ancestors
Flutter PR flutter/flutter#165596 (wiring up MenuAnchor-related widgets to SemanticsRole) breaks this test; fix it by adding the needed Semantics wrappers. Co-authored-by: Chris Bobbe <[email protected]>
1 parent 0268ca5 commit e0dff1e

File tree

2 files changed

+31
-22
lines changed

2 files changed

+31
-22
lines changed

lib/widgets/action_sheet.dart

+23-20
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'dart:async';
2+
import 'dart:ui';
23

34
import 'package:collection/collection.dart';
45
import 'package:flutter/foundation.dart';
@@ -42,26 +43,28 @@ void _showActionSheet(
4243
useSafeArea: true,
4344
isScrollControlled: true,
4445
builder: (BuildContext _) {
45-
return SafeArea(
46-
minimum: const EdgeInsets.only(bottom: 16),
47-
child: Padding(
48-
padding: const EdgeInsets.fromLTRB(16, 0, 16, 0),
49-
child: Column(
50-
crossAxisAlignment: CrossAxisAlignment.stretch,
51-
mainAxisSize: MainAxisSize.min,
52-
children: [
53-
// TODO(#217): show message text
54-
Flexible(child: InsetShadowBox(
55-
top: 8, bottom: 8,
56-
color: DesignVariables.of(context).bgContextMenu,
57-
child: SingleChildScrollView(
58-
padding: const EdgeInsets.only(top: 16, bottom: 8),
59-
child: ClipRRect(
60-
borderRadius: BorderRadius.circular(7),
61-
child: Column(spacing: 1,
62-
children: optionButtons))))),
63-
const ActionSheetCancelButton(),
64-
])));
46+
return Semantics(
47+
role: SemanticsRole.menu,
48+
child: SafeArea(
49+
minimum: const EdgeInsets.only(bottom: 16),
50+
child: Padding(
51+
padding: const EdgeInsets.fromLTRB(16, 0, 16, 0),
52+
child: Column(
53+
crossAxisAlignment: CrossAxisAlignment.stretch,
54+
mainAxisSize: MainAxisSize.min,
55+
children: [
56+
// TODO(#217): show message text
57+
Flexible(child: InsetShadowBox(
58+
top: 8, bottom: 8,
59+
color: DesignVariables.of(context).bgContextMenu,
60+
child: SingleChildScrollView(
61+
padding: const EdgeInsets.only(top: 16, bottom: 8),
62+
child: ClipRRect(
63+
borderRadius: BorderRadius.circular(7),
64+
child: Column(spacing: 1,
65+
children: optionButtons))))),
66+
const ActionSheetCancelButton(),
67+
]))));
6568
});
6669
}
6770

test/widgets/theme_test.dart

+8-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import 'dart:ui';
2+
13
import 'package:checks/checks.dart';
24
import 'package:flutter/material.dart';
35
import 'package:flutter/rendering.dart';
@@ -57,10 +59,14 @@ void main() {
5759
// IconButton can't have text; skip
5860

5961
doCheck('MenuItemButton',
60-
button: MenuItemButton(onPressed: () {}, child: const Text(buttonText)));
62+
button: Semantics(
63+
role: SemanticsRole.menu,
64+
child: MenuItemButton(onPressed: () {}, child: const Text(buttonText))));
6165

6266
doCheck('SubmenuButton',
63-
button: const SubmenuButton(menuChildren: [], child: Text(buttonText)));
67+
button: Semantics(
68+
role: SemanticsRole.menu,
69+
child: const SubmenuButton(menuChildren: [], child: Text(buttonText))));
6470

6571
doCheck('OutlinedButton',
6672
button: OutlinedButton(onPressed: () {}, child: const Text(buttonText)));

0 commit comments

Comments
 (0)