Skip to content

Commit 9a347fb

Browse files
authored
Support safe area and scrolling in the NavigationDrawer (#116995)
* Update navigation_drawer.dart * Update navigation_drawer_test.dart * Update navigation_drawer_test.dart * update tests * Update navigation_drawer_test.dart * Update navigation_drawer_test.dart
1 parent 400b05a commit 9a347fb

File tree

2 files changed

+94
-5
lines changed

2 files changed

+94
-5
lines changed

packages/flutter/lib/src/material/navigation_drawer.dart

+5-3
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,11 @@ class NavigationDrawer extends StatelessWidget {
164164
shadowColor: shadowColor,
165165
surfaceTintColor: surfaceTintColor,
166166
elevation: elevation,
167-
child: Column(
168-
crossAxisAlignment: CrossAxisAlignment.start,
169-
children: wrappedChildren,
167+
child: SafeArea(
168+
bottom: false,
169+
child: ListView(
170+
children: wrappedChildren,
171+
),
170172
),
171173
);
172174
}

packages/flutter/test/material/navigation_drawer_test.dart

+89-2
Original file line numberDiff line numberDiff line change
@@ -146,13 +146,100 @@ void main() {
146146
await tester.pump(const Duration(seconds: 1));
147147

148148
expect(_getMaterial(tester).color, ThemeData().colorScheme.surface);
149-
expect(_getMaterial(tester).surfaceTintColor,
150-
ThemeData().colorScheme.surfaceTint);
149+
expect(_getMaterial(tester).surfaceTintColor, ThemeData().colorScheme.surfaceTint);
151150
expect(_getMaterial(tester).elevation, 1);
152151
expect(_getIndicatorDecoration(tester)?.color, const Color(0xff2196f3));
153152
expect(_getIndicatorDecoration(tester)?.shape, const StadiumBorder());
154153
});
155154

155+
testWidgets('Navigation drawer is scrollable', (WidgetTester tester) async {
156+
final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
157+
widgetSetup(tester, 500, windowHeight: 300);
158+
await tester.pumpWidget(
159+
_buildWidget(
160+
scaffoldKey,
161+
NavigationDrawer(
162+
children: <Widget>[
163+
for(int i = 0; i < 100; i++)
164+
NavigationDrawerDestination(
165+
icon: const Icon(Icons.ac_unit),
166+
label: Text('Label$i'),
167+
),
168+
],
169+
onDestinationSelected: (int i) {},
170+
),
171+
),
172+
);
173+
scaffoldKey.currentState!.openDrawer();
174+
await tester.pump(const Duration(seconds: 1));
175+
176+
expect(find.text('Label0'), findsOneWidget);
177+
expect(find.text('Label1'), findsOneWidget);
178+
expect(find.text('Label2'), findsOneWidget);
179+
expect(find.text('Label3'), findsOneWidget);
180+
expect(find.text('Label4'), findsOneWidget);
181+
expect(find.text('Label5'), findsOneWidget);
182+
expect(find.text('Label6'), findsNothing);
183+
expect(find.text('Label7'), findsNothing);
184+
expect(find.text('Label8'), findsNothing);
185+
186+
await tester.dragFrom(const Offset(0, 200), const Offset(0.0, -200));
187+
await tester.pump();
188+
189+
expect(find.text('Label0'), findsNothing);
190+
expect(find.text('Label1'), findsNothing);
191+
expect(find.text('Label2'), findsNothing);
192+
expect(find.text('Label3'), findsOneWidget);
193+
expect(find.text('Label4'), findsOneWidget);
194+
expect(find.text('Label5'), findsOneWidget);
195+
expect(find.text('Label6'), findsOneWidget);
196+
expect(find.text('Label7'), findsOneWidget);
197+
expect(find.text('Label8'), findsOneWidget);
198+
expect(find.text('Label9'), findsNothing);
199+
expect(find.text('Label10'), findsNothing);
200+
});
201+
202+
testWidgets('Safe Area test', (WidgetTester tester) async {
203+
final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
204+
const double windowHeight = 300;
205+
widgetSetup(tester, 500, windowHeight: windowHeight);
206+
await tester.pumpWidget(
207+
MediaQuery(
208+
data: const MediaQueryData(padding: EdgeInsets.all(20.0)),
209+
child: MaterialApp(
210+
useInheritedMediaQuery: true,
211+
theme: ThemeData.light(),
212+
home: Scaffold(
213+
key: scaffoldKey,
214+
drawer: NavigationDrawer(
215+
children: <Widget>[
216+
for(int i = 0; i < 10; i++)
217+
NavigationDrawerDestination(
218+
icon: const Icon(Icons.ac_unit),
219+
label: Text('Label$i'),
220+
),
221+
],
222+
onDestinationSelected: (int i) {},
223+
),
224+
body: Container(),
225+
),
226+
),
227+
),
228+
);
229+
scaffoldKey.currentState!.openDrawer();
230+
await tester.pump();
231+
await tester.pump(const Duration(seconds: 1));
232+
233+
// Safe area padding on the top and sides.
234+
expect(
235+
tester.getTopLeft(find.widgetWithText(NavigationDrawerDestination,'Label0')),
236+
const Offset(20.0, 20.0),
237+
);
238+
239+
// No Safe area padding at the bottom.
240+
expect(tester.getBottomRight(find.widgetWithText(NavigationDrawerDestination,'Label4')).dy, windowHeight);
241+
});
242+
156243
testWidgets('Navigation drawer semantics', (WidgetTester tester) async {
157244
final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
158245
final ThemeData theme= ThemeData.from(colorScheme: const ColorScheme.light());

0 commit comments

Comments
 (0)