diff --git a/packages/flutter/lib/src/material/scaffold.dart b/packages/flutter/lib/src/material/scaffold.dart index 5045c39147..42e6f603d8 100644 --- a/packages/flutter/lib/src/material/scaffold.dart +++ b/packages/flutter/lib/src/material/scaffold.dart @@ -1590,7 +1590,8 @@ class Scaffold extends StatefulWidget { /// /// To open the drawer, use the [ScaffoldState.openDrawer] function. /// - /// To close the drawer, use [Navigator.pop]. + /// To close the drawer, use either [ScaffoldState.closeDrawer] or + /// [Navigator.pop]. /// /// {@tool dartpad} /// To disable the drawer edge swipe, set the @@ -1613,7 +1614,8 @@ class Scaffold extends StatefulWidget { /// /// To open the drawer, use the [ScaffoldState.openEndDrawer] function. /// - /// To close the drawer, use [Navigator.pop]. + /// To close the drawer, use either [ScaffoldState.closeEndDrawer] or + /// [Navigator.pop]. /// /// {@tool dartpad} /// To disable the drawer edge swipe, set the @@ -1986,7 +1988,8 @@ class ScaffoldState extends State with TickerProviderStateMixin, Resto /// appropriate [IconButton], and handles the edge-swipe gesture, to show the /// drawer. /// - /// To close the drawer once it is open, use [Navigator.pop]. + /// To close the drawer, use either [ScaffoldState.closeEndDrawer] or + /// [Navigator.pop]. /// /// See [Scaffold.of] for information about how to obtain the [ScaffoldState]. void openDrawer() { @@ -2004,7 +2007,8 @@ class ScaffoldState extends State with TickerProviderStateMixin, Resto /// appropriate [IconButton], and handles the edge-swipe gesture, to show the /// drawer. /// - /// To close the end side drawer once it is open, use [Navigator.pop]. + /// To close the drawer, use either [ScaffoldState.closeEndDrawer] or + /// [Navigator.pop]. /// /// See [Scaffold.of] for information about how to obtain the [ScaffoldState]. void openEndDrawer() { @@ -2305,6 +2309,24 @@ class ScaffoldState extends State with TickerProviderStateMixin, Resto } } + /// Closes [Scaffold.drawer] if it is currently opened. + /// + /// See [Scaffold.of] for information about how to obtain the [ScaffoldState]. + void closeDrawer() { + if (hasDrawer && isDrawerOpen) { + _drawerKey.currentState!.close(); + } + } + + /// Closes [Scaffold.endDrawer] if it is currently opened. + /// + /// See [Scaffold.of] for information about how to obtain the [ScaffoldState]. + void closeEndDrawer() { + if (hasEndDrawer && isEndDrawerOpen) { + _endDrawerKey.currentState!.close(); + } + } + void _updatePersistentBottomSheet() { _currentBottomSheetKey.currentState!.setState(() {}); } diff --git a/packages/flutter/test/material/drawer_test.dart b/packages/flutter/test/material/drawer_test.dart index 415366d982..12bde92a50 100644 --- a/packages/flutter/test/material/drawer_test.dart +++ b/packages/flutter/test/material/drawer_test.dart @@ -379,4 +379,70 @@ void main() { expect(find.text('drawer'), findsNothing); expect(find.text('endDrawer'), findsOneWidget); }); + + testWidgets('ScaffoldState close drawer', (WidgetTester tester) async { + final GlobalKey scaffoldKey = GlobalKey(); + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + key: scaffoldKey, + drawer: const Text('Drawer'), + body: Container(), + ), + ), + ); + + expect(find.text('Drawer'), findsNothing); + + scaffoldKey.currentState!.openDrawer(); + await tester.pumpAndSettle(); + expect(find.text('Drawer'), findsOneWidget); + + scaffoldKey.currentState!.closeDrawer(); + await tester.pumpAndSettle(); + expect(find.text('Drawer'), findsNothing); + }); + + testWidgets('ScaffoldState close drawer do not crash if drawer is already closed', (WidgetTester tester) async { + final GlobalKey scaffoldKey = GlobalKey(); + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + key: scaffoldKey, + drawer: const Text('Drawer'), + body: Container(), + ), + ), + ); + + expect(find.text('Drawer'), findsNothing); + + scaffoldKey.currentState!.closeDrawer(); + await tester.pumpAndSettle(); + expect(find.text('Drawer'), findsNothing); + }); + + + testWidgets('ScaffoldState close end drawer', (WidgetTester tester) async { + final GlobalKey scaffoldKey = GlobalKey(); + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + key: scaffoldKey, + endDrawer: const Text('endDrawer'), + body: Container(), + ), + ), + ); + + expect(find.text('endDrawer'), findsNothing); + + scaffoldKey.currentState!.openEndDrawer(); + await tester.pumpAndSettle(); + expect(find.text('endDrawer'), findsOneWidget); + + scaffoldKey.currentState!.closeEndDrawer(); + await tester.pumpAndSettle(); + expect(find.text('endDrawer'), findsNothing); + }); }