Skip to content

Commit 122ab83

Browse files
authored
Add assertion that snackbars have a place to go (flutter#103006)
1 parent 2e1c146 commit 122ab83

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,11 @@ class ScaffoldMessengerState extends State<ScaffoldMessenger> with TickerProvide
265265
/// ** See code in examples/api/lib/material/scaffold/scaffold_messenger_state.show_snack_bar.0.dart **
266266
/// {@end-tool}
267267
ScaffoldFeatureController<SnackBar, SnackBarClosedReason> showSnackBar(SnackBar snackBar) {
268+
assert(
269+
_scaffolds.isNotEmpty,
270+
'ScaffoldMessenger.showSnackBar was called, but there are currently no '
271+
'descendant Scaffolds to present to.',
272+
);
268273
_snackBarController ??= SnackBar.createAnimationController(vsync: this)
269274
..addStatusListener(_handleSnackBarStatusChanged);
270275
if (_snackBars.isEmpty) {

packages/flutter/test/material/snack_bar_test.dart

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2090,6 +2090,34 @@ void main() {
20902090
await tester.pump(const Duration(milliseconds: 750));
20912091
await expectLater(find.byType(MaterialApp), matchesGoldenFile('snack_bar.goldenTest.backdropFilter.png'));
20922092
});
2093+
2094+
testWidgets('ScaffoldMessenger will alert for snackbars that cannot be presented', (WidgetTester tester) async {
2095+
// Regression test for https://github.com/flutter/flutter/issues/103004
2096+
await tester.pumpWidget(const MaterialApp(
2097+
home: Center(),
2098+
));
2099+
2100+
final ScaffoldMessengerState scaffoldMessengerState = tester.state<ScaffoldMessengerState>(
2101+
find.byType(ScaffoldMessenger),
2102+
);
2103+
expect(
2104+
() {
2105+
scaffoldMessengerState.showSnackBar(const SnackBar(
2106+
content: Text('I am a snack bar.'),
2107+
));
2108+
},
2109+
throwsA(
2110+
isA<AssertionError>().having(
2111+
(AssertionError error) => error.toString(),
2112+
'description',
2113+
contains(
2114+
'ScaffoldMessenger.showSnackBar was called, but there are currently '
2115+
'no descendant Scaffolds to present to.'
2116+
)
2117+
),
2118+
),
2119+
);
2120+
});
20932121
}
20942122

20952123
/// Start test for "SnackBar dismiss test".

0 commit comments

Comments
 (0)