diff --git a/packages/flutter/lib/src/material/drawer.dart b/packages/flutter/lib/src/material/drawer.dart index b626d65985..42536f324b 100644 --- a/packages/flutter/lib/src/material/drawer.dart +++ b/packages/flutter/lib/src/material/drawer.dart @@ -436,9 +436,13 @@ class DrawerControllerState extends State with SingleTickerPro switch (Directionality.of(context)) { case TextDirection.rtl: _controller.fling(velocity: -visualVelocity); + if (widget.drawerCallback != null) + widget.drawerCallback(visualVelocity < 0.0); break; case TextDirection.ltr: _controller.fling(velocity: visualVelocity); + if (widget.drawerCallback != null) + widget.drawerCallback(visualVelocity > 0.0); break; } } else if (_controller.value < 0.5) { diff --git a/packages/flutter/test/material/drawer_test.dart b/packages/flutter/test/material/drawer_test.dart index 27ba89c298..0cdff9d1e5 100644 --- a/packages/flutter/test/material/drawer_test.dart +++ b/packages/flutter/test/material/drawer_test.dart @@ -166,4 +166,53 @@ void main() { await tester.pumpAndSettle(); expect(find.byType(Drawer), findsNothing); }); + + testWidgets('Open/close drawers by flinging', (WidgetTester tester) async { + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + drawer: Drawer( + child: Container( + child: const Text('start drawer'), + ), + ), + endDrawer: Drawer( + child: Container( + child: const Text('end drawer'), + ), + ), + ), + ), + ); + + // In the beginning, drawers are closed + final ScaffoldState state = tester.firstState(find.byType(Scaffold)); + expect(state.isDrawerOpen, equals(false)); + expect(state.isEndDrawerOpen, equals(false)); + final Size size = tester.getSize(find.byType(Scaffold)); + + // A fling from the left opens the start drawer + await tester.flingFrom(Offset(0, size.height / 2), const Offset(80, 0), 500); + await tester.pumpAndSettle(); + expect(state.isDrawerOpen, equals(true)); + expect(state.isEndDrawerOpen, equals(false)); + + // Now, a fling from the right closes the drawer + await tester.flingFrom(Offset(size.width - 1, size.height / 2), const Offset(-80, 0), 500); + await tester.pumpAndSettle(); + expect(state.isDrawerOpen, equals(false)); + expect(state.isEndDrawerOpen, equals(false)); + + // Another fling from the right opens the end drawer + await tester.flingFrom(Offset(size.width - 1, size.height / 2), const Offset(-80, 0), 500); + await tester.pumpAndSettle(); + expect(state.isDrawerOpen, equals(false)); + expect(state.isEndDrawerOpen, equals(true)); + + // And a fling from the left closes it + await tester.flingFrom( Offset(0, size.height / 2), const Offset(80, 0), 500); + await tester.pumpAndSettle(); + expect(state.isDrawerOpen, equals(false)); + expect(state.isEndDrawerOpen, equals(false)); + }); }