Unverified Commit dc432d78 authored by Bikram Pandit's avatar Bikram Pandit Committed by GitHub

Add detection of drawer open and close in Scaffold widget as a callback method. (#67249)

parent a7f5fd53
......@@ -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<Scaffold> 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).
......
......@@ -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) {
......
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