Unverified Commit 3aebc070 authored by David Shuckerow's avatar David Shuckerow Committed by GitHub

a11y adjustments for the Bottom app bar demo (#16238)

parent 7010bd41
...@@ -31,7 +31,7 @@ class _BottomAppBarDemoState extends State<BottomAppBarDemo> { ...@@ -31,7 +31,7 @@ class _BottomAppBarDemoState extends State<BottomAppBarDemo> {
// The index of the currently-selected _FabShapeConfiguration. // The index of the currently-selected _FabShapeConfiguration.
int fabShapeIndex = 1; int fabShapeIndex = 1;
static const List<_FabShapeConfiguration> _fabShapeConfigurations = const <_FabShapeConfiguration>[ static const List<_FabShapeConfiguration> _fabShapeConfigurations = const <_FabShapeConfiguration>[
const _FabShapeConfiguration('None', null), const _FabShapeConfiguration('None', null),
const _FabShapeConfiguration('Circular', const _FabShapeConfiguration('Circular',
const FloatingActionButton( const FloatingActionButton(
...@@ -51,6 +51,14 @@ class _BottomAppBarDemoState extends State<BottomAppBarDemo> { ...@@ -51,6 +51,14 @@ class _BottomAppBarDemoState extends State<BottomAppBarDemo> {
// The currently-selected Color for the Bottom App Bar. // The currently-selected Color for the Bottom App Bar.
Color babColor; Color babColor;
// Accessible names for the colors that a Screen Reader can use to
// identify them.
static final Map<Color, String> colorToName = <Color, String> {
null: 'White',
Colors.orange: 'Orange',
Colors.green: 'Green',
Colors.lightBlue: 'Light blue',
};
static const List<Color> babColors = const <Color> [ static const List<Color> babColors = const <Color> [
null, null,
Colors.orange, Colors.orange,
...@@ -93,25 +101,8 @@ class _BottomAppBarDemoState extends State<BottomAppBarDemo> { ...@@ -93,25 +101,8 @@ class _BottomAppBarDemoState extends State<BottomAppBarDemo> {
'Floating action button', 'Floating action button',
style: Theme.of(context).textTheme.title, style: Theme.of(context).textTheme.title,
), ),
new Row( buildFabShapePicker(),
mainAxisAlignment: MainAxisAlignment.spaceBetween, buildFabLocationPicker(),
children: <Widget>[
const SizedBox(width: 96.0,
child: const Text('Shape: '),
),
new Expanded(child: buildFabShapePicker()),
],
),
new Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
const SizedBox(
width: 96.0,
child: const Text('Location: '),
),
new Expanded(child: buildFabLocationPicker()),
],
),
const Divider(), const Divider(),
new Text( new Text(
'Bottom app bar options', 'Bottom app bar options',
...@@ -133,30 +124,51 @@ class _BottomAppBarDemoState extends State<BottomAppBarDemo> { ...@@ -133,30 +124,51 @@ class _BottomAppBarDemoState extends State<BottomAppBarDemo> {
} }
Widget buildFabShapePicker() { Widget buildFabShapePicker() {
return new Padding( return new Row(
padding: const EdgeInsets.all(8.0), mainAxisAlignment: MainAxisAlignment.spaceBetween,
child: new RaisedButton( children: <Widget>[
child: const Text('Change'), const SizedBox(width: 96.0,
onPressed: () { child: const Text('Shape: '),
setState(() { ),
fabShapeIndex = (fabShapeIndex + 1) % _fabShapeConfigurations.length; new Expanded(
}); child: new Padding(
}, padding: const EdgeInsets.all(8.0),
), child: new RaisedButton(
child: const Text('Change shape'),
onPressed: () {
setState(() {
fabShapeIndex = (fabShapeIndex + 1) % _fabShapeConfigurations.length;
});
},
),
),
),
],
); );
} }
Widget buildFabLocationPicker() { Widget buildFabLocationPicker() {
return new Padding( return new Row(
padding: const EdgeInsets.all(8.0), mainAxisAlignment: MainAxisAlignment.spaceBetween,
child: new RaisedButton( children: <Widget>[
child: const Text('Move'), const SizedBox(
onPressed: () { width: 96.0,
setState(() { child: const Text('Location: '),
fabLocationIndex = (fabLocationIndex + 1) % _fabLocationConfigurations.length; ),
}); new Expanded(
}, child: new Padding(
), padding: const EdgeInsets.all(8.0),
child: new RaisedButton(
child: const Text('Move'),
onPressed: () {
setState(() {
fabLocationIndex = (fabLocationIndex + 1) % _fabLocationConfigurations.length;
});
},
),
),
),
],
); );
} }
...@@ -166,30 +178,38 @@ class _BottomAppBarDemoState extends State<BottomAppBarDemo> { ...@@ -166,30 +178,38 @@ class _BottomAppBarDemoState extends State<BottomAppBarDemo> {
]; ];
for (Color color in babColors) { for (Color color in babColors) {
colors.add( colors.add(
new Radio<Color>( new Semantics(
value: color, label: 'Set Bottom App Bar color to ${colorToName[color]}',
groupValue: babColor, container: true,
onChanged: (Color color) { explicitChildNodes: false,
setState(() { child: new Row(children: <Widget> [
babColor = color; new Radio<Color>(
}); value: color,
}, groupValue: babColor,
), onChanged: (Color color) {
); setState(() {
colors.add( babColor = color;
new Container( });
decoration: new BoxDecoration( },
color: color, ),
border: new Border.all(width:2.0, color: Colors.black), new Container(
), decoration: new BoxDecoration(
child: const SizedBox(width: 20.0, height: 20.0), color: color,
border: new Border.all(width:2.0, color: Colors.black),
),
child: const SizedBox(width: 20.0, height: 20.0),
),
const Padding(padding: const EdgeInsets.only(left: 12.0)),
]),
), ),
); );
colors.add(const Padding(padding: const EdgeInsets.only(left: 12.0)));
} }
return new Row( return new SingleChildScrollView(
children: colors, scrollDirection: Axis.horizontal,
mainAxisAlignment: MainAxisAlignment.center, child: new Row(
children: colors,
mainAxisAlignment: MainAxisAlignment.center,
),
); );
} }
...@@ -261,7 +281,8 @@ class _DemoBottomAppBar extends StatelessWidget { ...@@ -261,7 +281,8 @@ class _DemoBottomAppBar extends StatelessWidget {
new IconButton( new IconButton(
icon: const Icon(Icons.menu), icon: const Icon(Icons.menu),
onPressed: () { onPressed: () {
showModalBottomSheet<Null>(context: context, builder: (BuildContext context) => const _DemoDrawer()); }, showModalBottomSheet<Null>(context: context, builder: (BuildContext context) => const _DemoDrawer());
},
), ),
new Expanded( new Expanded(
child: new AnimatedCrossFade( child: new AnimatedCrossFade(
...@@ -290,14 +311,35 @@ class _DemoBottomAppBar extends StatelessWidget { ...@@ -290,14 +311,35 @@ class _DemoBottomAppBar extends StatelessWidget {
); );
} }
rowContents.addAll(<Widget> [ rowContents.addAll(<Widget> [
new IconButton( // Generally, an icon button does not need to be wrapped in a Semantics object.
icon: const Icon(Icons.search), // When the button has a null onPressed callback, it will be disabled by default.
onPressed: () {}, //
// However, for the purposes of this demo, we don't want the button to appear disabled.
// To achieve this we use a no-op callback instead of a null callback. This allows
// the buttons to appear active, but perform no actions.
//
// To tell the accessibility service that the callback is a no-op, the Semantics widget
// wraps these buttons with `enabled: false`.
new Semantics(
label: 'Search',
container: true,
explicitChildNodes: false,
enabled: false,
child: new IconButton(
icon: const Icon(Icons.search),
onPressed: () {},
),
),
new Semantics(
label: 'Show more',
container: true,
explicitChildNodes: false,
enabled: false,
child: new IconButton(
icon: const Icon(Icons.more_vert),
onPressed: () {},
),
), ),
new IconButton(
icon: const Icon(Icons.more_vert),
onPressed: () {},
)
]); ]);
return new Row( return new Row(
children: rowContents, children: rowContents,
......
...@@ -89,7 +89,7 @@ List<GalleryItem> _buildGalleryItems() { ...@@ -89,7 +89,7 @@ List<GalleryItem> _buildGalleryItems() {
buildRoute: (BuildContext context) => new BackdropDemo(), buildRoute: (BuildContext context) => new BackdropDemo(),
), ),
new GalleryItem( new GalleryItem(
title: 'Bottom App Bar', title: 'Bottom app bar',
subtitle: 'With repositionable floating action button', subtitle: 'With repositionable floating action button',
category: 'Material Components', category: 'Material Components',
routeName: BottomAppBarDemo.routeName, routeName: BottomAppBarDemo.routeName,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment