Scaffold Drawer pull out area fix for notched devices (#24367)
* Adds fix and test
This commit is contained in:
parent
4a79caf96b
commit
b3d9fb4dee
@ -0,0 +1,8 @@
|
||||
<?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 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
|
||||
@ -375,6 +377,14 @@ class DrawerControllerState extends State<DrawerController> with SingleTickerPro
|
||||
}
|
||||
|
||||
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) {
|
||||
return Align(
|
||||
alignment: _drawerOuterAlignment,
|
||||
@ -384,7 +394,7 @@ class DrawerControllerState extends State<DrawerController> with SingleTickerPro
|
||||
onHorizontalDragEnd: _settle,
|
||||
behavior: HitTestBehavior.translucent,
|
||||
excludeFromSemantics: true,
|
||||
child: Container(width: _kEdgeDragWidth)
|
||||
child: Container(width: dragAreaWidth),
|
||||
),
|
||||
);
|
||||
} else {
|
||||
@ -420,7 +430,7 @@ class DrawerControllerState extends State<DrawerController> with SingleTickerPro
|
||||
child: FocusScope(
|
||||
key: _drawerKey,
|
||||
node: _focusScopeNode,
|
||||
child: widget.child
|
||||
child: widget.child,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
@ -1103,6 +1103,99 @@ void main() {
|
||||
expect(find.text('endDrawer'), findsNothing);
|
||||
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);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user