From dc432d78db349bb02aeee23c8e75c2acdee7702c Mon Sep 17 00:00:00 2001 From: Bikram Pandit Date: Tue, 1 Dec 2020 23:28:06 +0545 Subject: [PATCH] Add detection of drawer open and close in Scaffold widget as a callback method. (#67249) --- .../flutter/lib/src/material/scaffold.dart | 10 +++++ .../flutter/test/material/scaffold_test.dart | 38 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/packages/flutter/lib/src/material/scaffold.dart b/packages/flutter/lib/src/material/scaffold.dart index 7e89bf5430..f4bd4418de 100644 --- a/packages/flutter/lib/src/material/scaffold.dart +++ b/packages/flutter/lib/src/material/scaffold.dart @@ -1443,7 +1443,9 @@ class Scaffold extends StatefulWidget { this.floatingActionButtonAnimator, this.persistentFooterButtons, this.drawer, + this.onDrawerChanged, this.endDrawer, + this.onEndDrawerChanged, this.bottomNavigationBar, this.bottomSheet, this.backgroundColor, @@ -1607,6 +1609,9 @@ class Scaffold extends StatefulWidget { /// {@end-tool} final Widget? drawer; + /// Optional callback that is called when the [Scaffold.drawer] is opened or closed. + final DrawerCallback? onDrawerChanged; + /// A panel displayed to the side of the [body], often hidden on mobile /// devices. Swipes in from right-to-left ([TextDirection.ltr]) or /// left-to-right ([TextDirection.rtl]) @@ -1667,6 +1672,9 @@ class Scaffold extends StatefulWidget { /// {@end-tool} final Widget? endDrawer; + /// Optional callback that is called when the [Scaffold.endDrawer] is opened or closed. + final DrawerCallback? onEndDrawerChanged; + /// The color to use for the scrim that obscures primary content while a drawer is open. /// /// By default, the color is [Colors.black54] @@ -2091,12 +2099,14 @@ class ScaffoldState extends State with TickerProviderStateMixin { setState(() { _drawerOpened = isOpened; }); + widget.onDrawerChanged?.call(isOpened); } void _endDrawerOpenedCallback(bool isOpened) { setState(() { _endDrawerOpened = isOpened; }); + widget.onEndDrawerChanged?.call(isOpened); } /// Opens the [Drawer] (if any). diff --git a/packages/flutter/test/material/scaffold_test.dart b/packages/flutter/test/material/scaffold_test.dart index 439e3c6c25..38539d8796 100644 --- a/packages/flutter/test/material/scaffold_test.dart +++ b/packages/flutter/test/material/scaffold_test.dart @@ -11,6 +11,44 @@ import 'package:flutter_test/flutter_test.dart'; import '../widgets/semantics_tester.dart'; void main() { + testWidgets('Scaffold drawer callback test', (WidgetTester tester) async { + bool isDrawerOpen = false; + bool isEndDrawerOpen = false; + + await tester.pumpWidget(MaterialApp( + home: Scaffold( + drawer: Container( + color: Colors.blue, + ), + onDrawerChanged: (bool isOpen) { + isDrawerOpen = isOpen; + }, + endDrawer: Container( + color: Colors.green, + ), + onEndDrawerChanged: (bool isOpen) { + isEndDrawerOpen = isOpen; + }, + body: Container()), + )); + + final ScaffoldState scaffoldState = tester.state(find.byType(Scaffold)); + + scaffoldState.openDrawer(); + await tester.pumpAndSettle(); + expect(true, isDrawerOpen); + scaffoldState.openEndDrawer(); + await tester.pumpAndSettle(); + expect(false, isDrawerOpen); + + scaffoldState.openEndDrawer(); + await tester.pumpAndSettle(); + expect(true, isEndDrawerOpen); + scaffoldState.openDrawer(); + await tester.pumpAndSettle(); + expect(false, isEndDrawerOpen); + }); + testWidgets('Scaffold control test', (WidgetTester tester) async { final Key bodyKey = UniqueKey(); Widget boilerplate(Widget child) {