diff --git a/dev/a11y_assessments/lib/use_cases/material_banner.dart b/dev/a11y_assessments/lib/use_cases/material_banner.dart index 915fa421bf..2ba15dd39e 100644 --- a/dev/a11y_assessments/lib/use_cases/material_banner.dart +++ b/dev/a11y_assessments/lib/use_cases/material_banner.dart @@ -25,38 +25,43 @@ class MainWidget extends StatefulWidget { } class MainWidgetState extends State { - double currentSliderValue = 20; - ScaffoldFeatureController? - controller; + + final FocusNode dismissButtonFocusNode = FocusNode(); + final FocusNode showButtonFocusNode = FocusNode(); + + @override + void dispose() { + dismissButtonFocusNode.dispose(); + showButtonFocusNode.dispose(); + super.dispose(); + } + + void hideBanner() { + ScaffoldMessenger.of(context).hideCurrentMaterialBanner(); + showButtonFocusNode.requestFocus(); + } + + void showBanner() { + ScaffoldMessenger.of(context).showMaterialBanner( + MaterialBanner( + padding: const EdgeInsets.all(20), + content: const Text('Hello, I am a Material Banner'), + leading: const Icon(Icons.agriculture_outlined), + backgroundColor: Colors.yellowAccent, + actions: [ + TextButton( + focusNode: dismissButtonFocusNode, + onPressed: hideBanner, + child: const Text('DISMISS'), + ), + ], + ), + ); + dismissButtonFocusNode.requestFocus(); + } @override Widget build(BuildContext context) { - VoidCallback? onPress; - if (controller == null) { - onPress = () { - setState(() { - controller = ScaffoldMessenger.of(context).showMaterialBanner( - MaterialBanner( - padding: const EdgeInsets.all(20), - content: const Text('Hello, I am a Material Banner'), - leading: const Icon(Icons.agriculture_outlined), - backgroundColor: Colors.green, - actions: [ - TextButton( - onPressed: () { - controller!.close(); - setState(() { - controller = null; - }); - }, - child: const Text('DISMISS'), - ), - ], - ), - ); - }); - }; - } return Scaffold( appBar: AppBar( backgroundColor: Theme.of(context).colorScheme.inversePrimary, @@ -64,7 +69,8 @@ class MainWidgetState extends State { ), body: Center( child: ElevatedButton( - onPressed: onPress, + focusNode: showButtonFocusNode, + onPressed: showBanner, child: const Text('Show a MaterialBanner'), ), ), diff --git a/dev/a11y_assessments/test/material_banner_test.dart b/dev/a11y_assessments/test/material_banner_test.dart index 33af04eb3f..5d6d2d3c4c 100644 --- a/dev/a11y_assessments/test/material_banner_test.dart +++ b/dev/a11y_assessments/test/material_banner_test.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. import 'package:a11y_assessments/use_cases/material_banner.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'test_utils.dart'; @@ -21,6 +22,26 @@ void main() { expect(find.text('Hello, I am a Material Banner'), findsNothing); }); + testWidgets('dismiss button focused on banner open', (WidgetTester tester) async { + await pumpsUseCase(tester, MaterialBannerUseCase()); + await tester.tap(find.text('Show a MaterialBanner')); + await tester.pumpAndSettle(); + + final TextButton dismissButtonFinder = tester.widget(find.byType(TextButton)); + expect(dismissButtonFinder.focusNode!.hasFocus, isTrue); + }); + + testWidgets('show button focused on banner close', (WidgetTester tester) async { + await pumpsUseCase(tester, MaterialBannerUseCase()); + await tester.tap(find.text('Show a MaterialBanner')); + await tester.pumpAndSettle(); + + await tester.tap(find.byType(TextButton)); + + final ElevatedButton showButtonFinder = tester.widget(find.byType(ElevatedButton)); + expect(showButtonFinder.focusNode!.hasFocus, isTrue); + }); + testWidgets('material banner has one h1 tag', (WidgetTester tester) async { await pumpsUseCase(tester, MaterialBannerUseCase()); final Finder findHeadingLevelOnes = find.bySemanticsLabel('MaterialBanner Demo');