diff --git a/packages/flutter/lib/src/material/dialog.dart b/packages/flutter/lib/src/material/dialog.dart index bbc5b987a3..6aadb566e0 100644 --- a/packages/flutter/lib/src/material/dialog.dart +++ b/packages/flutter/lib/src/material/dialog.dart @@ -427,7 +427,18 @@ class _DialogRoute extends PopupRoute { @override Widget buildPage(BuildContext context, Animation animation, Animation secondaryAnimation) { - return theme != null ? new Theme(data: theme, child: child) : child; + return new MediaQuery.removePadding( + context: context, + removeTop: true, + removeBottom: true, + removeLeft: true, + removeRight: true, + child: new Builder( + builder: (BuildContext context) { + return theme != null ? new Theme(data: theme, child: child) : child; + } + ), + ); } @override diff --git a/packages/flutter/lib/src/material/dropdown.dart b/packages/flutter/lib/src/material/dropdown.dart index c926ba9b07..6945018542 100644 --- a/packages/flutter/lib/src/material/dropdown.dart +++ b/packages/flutter/lib/src/material/dropdown.dart @@ -335,14 +335,25 @@ class _DropdownRoute extends PopupRoute<_DropdownRouteResult> { if (theme != null) menu = new Theme(data: theme, child: menu); - return new CustomSingleChildLayout( - delegate: new _DropdownMenuRouteLayout( - buttonRect: buttonRect, - menuTop: menuTop, - menuHeight: menuHeight, - textDirection: Directionality.of(context), + return new MediaQuery.removePadding( + context: context, + removeTop: true, + removeBottom: true, + removeLeft: true, + removeRight: true, + child: new Builder( + builder: (BuildContext context) { + return new CustomSingleChildLayout( + delegate: new _DropdownMenuRouteLayout( + buttonRect: buttonRect, + menuTop: menuTop, + menuHeight: menuHeight, + textDirection: Directionality.of(context), + ), + child: menu, + ); + }, ), - child: menu, ); } diff --git a/packages/flutter/lib/src/material/popup_menu.dart b/packages/flutter/lib/src/material/popup_menu.dart index d0b9867216..23f692b10a 100644 --- a/packages/flutter/lib/src/material/popup_menu.dart +++ b/packages/flutter/lib/src/material/popup_menu.dart @@ -591,17 +591,24 @@ class _PopupMenuRoute extends PopupRoute { if (theme != null) menu = new Theme(data: theme, child: menu); - return new Builder( - builder: (BuildContext context) { - return new CustomSingleChildLayout( - delegate: new _PopupMenuRouteLayout( - position, - selectedItemOffset, - Directionality.of(context), - ), - child: menu, - ); - }, + return new MediaQuery.removePadding( + context: context, + removeTop: true, + removeBottom: true, + removeLeft: true, + removeRight: true, + child: new Builder( + builder: (BuildContext context) { + return new CustomSingleChildLayout( + delegate: new _PopupMenuRouteLayout( + position, + selectedItemOffset, + Directionality.of(context), + ), + child: menu, + ); + }, + ), ); } } diff --git a/packages/flutter/test/material/dialog_test.dart b/packages/flutter/test/material/dialog_test.dart index e83ff93b07..04c7517a27 100644 --- a/packages/flutter/test/material/dialog_test.dart +++ b/packages/flutter/test/material/dialog_test.dart @@ -229,4 +229,40 @@ void main() { semantics.dispose(); }); + + testWidgets('Dialogs removes MediaQuery padding', (WidgetTester tester) async { + BuildContext scaffoldContext; + BuildContext dialogContext; + + await tester.pumpWidget(new MaterialApp( + home: new MediaQuery( + data: const MediaQueryData( + padding: const EdgeInsets.all(50.0), + ), + child: new Builder( + builder: (BuildContext context) { + scaffoldContext = context; + return new Container(); + } + ), + ) + )); + + await tester.pump(); + + showDialog( + context: scaffoldContext, + barrierDismissible: false, + child: new Builder( + builder: (BuildContext context) { + dialogContext = context; + return new Container(); + }, + ), + ); + + await tester.pump(); + + expect(MediaQuery.of(dialogContext).padding, EdgeInsets.zero); + }); } diff --git a/packages/flutter/test/material/persistent_bottom_sheet_test.dart b/packages/flutter/test/material/persistent_bottom_sheet_test.dart index ca3518aae4..95cf927056 100644 --- a/packages/flutter/test/material/persistent_bottom_sheet_test.dart +++ b/packages/flutter/test/material/persistent_bottom_sheet_test.dart @@ -91,4 +91,46 @@ void main() { expect(buildCount, equals(1)); }); + testWidgets('Scaffold removes top MediaQuery padding', (WidgetTester tester) async { + BuildContext scaffoldContext; + BuildContext bottomSheetContext; + + await tester.pumpWidget(new MaterialApp( + home: new MediaQuery( + data: const MediaQueryData( + padding: const EdgeInsets.all(50.0), + ), + child: new Scaffold( + resizeToAvoidBottomPadding: false, + body: new Builder( + builder: (BuildContext context) { + scaffoldContext = context; + return new Container(); + } + ), + ), + ) + )); + + await tester.pump(); + + showBottomSheet( + context: scaffoldContext, + builder: (BuildContext context) { + bottomSheetContext = context; + return new Container(); + }, + ); + + await tester.pump(); + + expect( + MediaQuery.of(bottomSheetContext).padding, + const EdgeInsets.only( + bottom: 50.0, + left: 50.0, + right: 50.0, + ), + ); + }); } diff --git a/packages/flutter/test/material/popup_menu_test.dart b/packages/flutter/test/material/popup_menu_test.dart index 51401a1ca4..19a2dd8ac6 100644 --- a/packages/flutter/test/material/popup_menu_test.dart +++ b/packages/flutter/test/material/popup_menu_test.dart @@ -315,6 +315,47 @@ void main() { await testPositioningDownThenUp(tester, TextDirection.ltr, Alignment.bottomCenter, TextDirection.ltr, new Rect.fromLTWH(350.0, 500.0, 0.0, 0.0)); await testPositioningDownThenUp(tester, TextDirection.rtl, Alignment.bottomCenter, TextDirection.rtl, new Rect.fromLTWH(450.0, 500.0, 0.0, 0.0)); }); + + testWidgets('PopupMenu removes MediaQuery padding', (WidgetTester tester) async { + BuildContext popupContext; + + await tester.pumpWidget(new MaterialApp( + home: new MediaQuery( + data: const MediaQueryData( + padding: const EdgeInsets.all(50.0), + ), + child: new Material( + child: new PopupMenuButton( + itemBuilder: (BuildContext context) { + popupContext = context; + return >[ + new PopupMenuItem( + value: 1, + child: new Builder( + builder: (BuildContext context) { + popupContext = context; + return const Text('AAA'); + }, + ), + ), + ]; + }, + child: const SizedBox( + height: 100.0, + width: 100.0, + child: const Text('XXX'), + ), + ), + ), + ) + )); + + await tester.tap(find.text('XXX')); + + await tester.pump(); + + expect(MediaQuery.of(popupContext).padding, EdgeInsets.zero); + }); } class TestApp extends StatefulWidget {