Unverified Commit b3d9fb4d authored by jslavitz's avatar jslavitz Committed by GitHub

Scaffold Drawer pull out area fix for notched devices (#24367)

* Adds fix and test
parent 4a79caf9
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
import 'dart:math';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
...@@ -375,6 +377,14 @@ class DrawerControllerState extends State<DrawerController> with SingleTickerPro ...@@ -375,6 +377,14 @@ class DrawerControllerState extends State<DrawerController> with SingleTickerPro
} }
Widget _buildDrawer(BuildContext context) { Widget _buildDrawer(BuildContext context) {
final bool drawerIsStart = widget.alignment == DrawerAlignment.start;
final EdgeInsets padding = MediaQuery.of(context).padding;
double dragAreaWidth = drawerIsStart ? padding.left : padding.right;
if (Directionality.of(context) == TextDirection.rtl)
dragAreaWidth = drawerIsStart ? padding.right : padding.left;
dragAreaWidth = max(dragAreaWidth, _kEdgeDragWidth);
if (_controller.status == AnimationStatus.dismissed) { if (_controller.status == AnimationStatus.dismissed) {
return Align( return Align(
alignment: _drawerOuterAlignment, alignment: _drawerOuterAlignment,
...@@ -384,7 +394,7 @@ class DrawerControllerState extends State<DrawerController> with SingleTickerPro ...@@ -384,7 +394,7 @@ class DrawerControllerState extends State<DrawerController> with SingleTickerPro
onHorizontalDragEnd: _settle, onHorizontalDragEnd: _settle,
behavior: HitTestBehavior.translucent, behavior: HitTestBehavior.translucent,
excludeFromSemantics: true, excludeFromSemantics: true,
child: Container(width: _kEdgeDragWidth) child: Container(width: dragAreaWidth),
), ),
); );
} else { } else {
...@@ -420,7 +430,7 @@ class DrawerControllerState extends State<DrawerController> with SingleTickerPro ...@@ -420,7 +430,7 @@ class DrawerControllerState extends State<DrawerController> with SingleTickerPro
child: FocusScope( child: FocusScope(
key: _drawerKey, key: _drawerKey,
node: _focusScopeNode, node: _focusScopeNode,
child: widget.child child: widget.child,
), ),
), ),
), ),
......
...@@ -1103,6 +1103,99 @@ void main() { ...@@ -1103,6 +1103,99 @@ void main() {
expect(find.text('endDrawer'), findsNothing); expect(find.text('endDrawer'), findsNothing);
expect(find.text('drawer'), findsOneWidget); expect(find.text('drawer'), findsOneWidget);
}); });
testWidgets('Drawer opens correctly with padding from MediaQuery', (WidgetTester tester) async {
// The padding described by MediaQuery is larger than the default
// drawer drag zone width which is 20.
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
drawer: const Drawer(
child: Text('drawer'),
),
body: const Text('scaffold body'),
appBar: AppBar(
centerTitle: true,
title: const Text('Title')
),
),
),
);
ScaffoldState scaffoldState = tester.state(find.byType(Scaffold));
expect(scaffoldState.isDrawerOpen, false);
await tester.dragFrom(const Offset(35, 100), const Offset(300, 0));
await tester.pumpAndSettle();
expect(scaffoldState.isDrawerOpen, false);
await tester.pumpWidget(
MaterialApp(
home: MediaQuery(
data: const MediaQueryData(
padding: EdgeInsets.fromLTRB(40, 0, 0, 0)
),
child: Scaffold(
drawer: const Drawer(
child: Text('drawer'),
),
body: const Text('scaffold body'),
appBar: AppBar(
centerTitle: true,
title: const Text('Title')
),
),
),
),
);
scaffoldState = tester.state(find.byType(Scaffold));
expect(scaffoldState.isDrawerOpen, false);
await tester.dragFrom(const Offset(35, 100), const Offset(300, 0));
await tester.pumpAndSettle();
expect(scaffoldState.isDrawerOpen, true);
});
testWidgets('Drawer opens correctly with padding from MediaQuer (RTL)', (WidgetTester tester) async {
// The padding described by MediaQuery is larger than the default
// drawer drag zone width which is 20.
await tester.pumpWidget(
MaterialApp(
home: MediaQuery(
data: const MediaQueryData(
padding: EdgeInsets.fromLTRB(0, 0, 40, 0)
),
child: Directionality(
textDirection: TextDirection.rtl,
child: Scaffold(
drawer: const Drawer(
child: Text('drawer'),
),
body: const Text('scaffold body'),
appBar: AppBar(
centerTitle: true,
title: const Text('Title')
),
),
),
),
),
);
final ScaffoldState scaffoldState = tester.state(find.byType(Scaffold));
expect(scaffoldState.isDrawerOpen, false);
await tester.dragFrom(const Offset(765, 100), const Offset(-300, 0));
await tester.pumpAndSettle();
expect(scaffoldState.isDrawerOpen, true);
});
}); });
} }
......
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