From 67697cf78e6641bb621c7f30e8819b07b9d0c01e Mon Sep 17 00:00:00 2001 From: xubaolin Date: Fri, 8 Jan 2021 19:08:47 +0800 Subject: [PATCH 1/3] snackBar should paint above the bootSheet --- .../flutter/lib/src/material/scaffold.dart | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/flutter/lib/src/material/scaffold.dart b/packages/flutter/lib/src/material/scaffold.dart index e7cf5fc831271..dea847247312f 100644 --- a/packages/flutter/lib/src/material/scaffold.dart +++ b/packages/flutter/lib/src/material/scaffold.dart @@ -3051,6 +3051,25 @@ class ScaffoldState extends State with TickerProviderStateMixin, Resto ); } + if (_currentBottomSheet != null || _dismissedBottomSheets.isNotEmpty) { + final Widget stack = Stack( + alignment: Alignment.bottomCenter, + children: [ + ..._dismissedBottomSheets, + if (_currentBottomSheet != null) _currentBottomSheet!._widget, + ], + ); + _addIfNonNull( + children, + stack, + _ScaffoldSlot.bottomSheet, + removeLeftPadding: false, + removeTopPadding: true, + removeRightPadding: false, + removeBottomPadding: _resizeToAvoidBottomInset, + ); + } + // SnackBar set by Scaffold // TODO(Piinks): Remove old SnackBar API after migrating ScaffoldMessenger if (_snackBars.isNotEmpty) { @@ -3110,25 +3129,6 @@ class ScaffoldState extends State with TickerProviderStateMixin, Resto ); } - if (_currentBottomSheet != null || _dismissedBottomSheets.isNotEmpty) { - final Widget stack = Stack( - alignment: Alignment.bottomCenter, - children: [ - ..._dismissedBottomSheets, - if (_currentBottomSheet != null) _currentBottomSheet!._widget, - ], - ); - _addIfNonNull( - children, - stack, - _ScaffoldSlot.bottomSheet, - removeLeftPadding: false, - removeTopPadding: true, - removeRightPadding: false, - removeBottomPadding: _resizeToAvoidBottomInset, - ); - } - _addIfNonNull( children, _FloatingActionButtonTransition( From 0617b17031f7badca72a642009bda05089b87250 Mon Sep 17 00:00:00 2001 From: xubaolin Date: Fri, 8 Jan 2021 19:17:24 +0800 Subject: [PATCH 2/3] snackBar should paint above the bootSheet --- .../flutter/lib/src/material/scaffold.dart | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/flutter/lib/src/material/scaffold.dart b/packages/flutter/lib/src/material/scaffold.dart index dea847247312f..0b75ad3194883 100644 --- a/packages/flutter/lib/src/material/scaffold.dart +++ b/packages/flutter/lib/src/material/scaffold.dart @@ -3031,6 +3031,25 @@ class ScaffoldState extends State with TickerProviderStateMixin, Resto 'the preferred API instead of the Scaffold methods.' ); + if (_currentBottomSheet != null || _dismissedBottomSheets.isNotEmpty) { + final Widget stack = Stack( + alignment: Alignment.bottomCenter, + children: [ + ..._dismissedBottomSheets, + if (_currentBottomSheet != null) _currentBottomSheet!._widget, + ], + ); + _addIfNonNull( + children, + stack, + _ScaffoldSlot.bottomSheet, + removeLeftPadding: false, + removeTopPadding: true, + removeRightPadding: false, + removeBottomPadding: _resizeToAvoidBottomInset, + ); + } + // SnackBar set by ScaffoldMessenger if (_messengerSnackBar != null) { final SnackBarBehavior snackBarBehavior = _messengerSnackBar?._widget.behavior @@ -3051,25 +3070,6 @@ class ScaffoldState extends State with TickerProviderStateMixin, Resto ); } - if (_currentBottomSheet != null || _dismissedBottomSheets.isNotEmpty) { - final Widget stack = Stack( - alignment: Alignment.bottomCenter, - children: [ - ..._dismissedBottomSheets, - if (_currentBottomSheet != null) _currentBottomSheet!._widget, - ], - ); - _addIfNonNull( - children, - stack, - _ScaffoldSlot.bottomSheet, - removeLeftPadding: false, - removeTopPadding: true, - removeRightPadding: false, - removeBottomPadding: _resizeToAvoidBottomInset, - ); - } - // SnackBar set by Scaffold // TODO(Piinks): Remove old SnackBar API after migrating ScaffoldMessenger if (_snackBars.isNotEmpty) { From fa3f901081c8313c491c6857f2b11ac9749a18cd Mon Sep 17 00:00:00 2001 From: xubaolin Date: Sat, 9 Jan 2021 11:45:51 +0800 Subject: [PATCH 3/3] Add a golden file test --- .../flutter/test/material/snack_bar_test.dart | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/packages/flutter/test/material/snack_bar_test.dart b/packages/flutter/test/material/snack_bar_test.dart index 7fe96ccd28b20..7f4bd70559aeb 100644 --- a/packages/flutter/test/material/snack_bar_test.dart +++ b/packages/flutter/test/material/snack_bar_test.dart @@ -2265,4 +2265,29 @@ void main() { final AssertionError error = exceptions.first as AssertionError; expect(error.message, contains('Only one API should be used to manage SnackBars.')); }); + + testWidgets('SnackBars should be shown above the bottomSheet', (WidgetTester tester) async { + await tester.pumpWidget(const MaterialApp( + home: Scaffold( + bottomSheet: SizedBox( + width: 200, + height: 50, + child: ColoredBox( + color: Colors.pink, + ), + ), + ), + )); + + final ScaffoldMessengerState scaffoldMessengerState = tester.state(find.byType(ScaffoldMessenger)); + scaffoldMessengerState.showSnackBar(SnackBar( + content: const Text('I love Flutter!'), + duration: const Duration(seconds: 2), + action: SnackBarAction(label: 'ACTION', onPressed: () {}), + behavior: SnackBarBehavior.floating, + )); + await tester.pumpAndSettle(); // Have the SnackBar fully animate out. + + await expectLater(find.byType(MaterialApp), matchesGoldenFile('snack_bar.goldenTest.workWithBottomSheet.png')); + }); }