From aa16a8cac04049aa9afe13493d2851756ac3b51d Mon Sep 17 00:00:00 2001 From: Chinmoy <57670338+chinmoy12c@users.noreply.github.com> Date: Tue, 2 Mar 2021 05:35:02 +0530 Subject: [PATCH] Added clearSnackBars method to ScaffoldMessengerState (#76146) --- .../flutter/lib/src/material/scaffold.dart | 11 ++++ .../flutter/test/material/snack_bar_test.dart | 50 +++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/packages/flutter/lib/src/material/scaffold.dart b/packages/flutter/lib/src/material/scaffold.dart index d5b80b2d70..b08bc7461b 100644 --- a/packages/flutter/lib/src/material/scaffold.dart +++ b/packages/flutter/lib/src/material/scaffold.dart @@ -432,6 +432,17 @@ class ScaffoldMessengerState extends State with TickerProvide _snackBarTimer = null; } + /// Removes all the snackBars currently in queue by clearing the queue + /// and running normal exit animation on the current snackBar. + void clearSnackBars() { + if (_snackBars.isEmpty || _snackBarController!.status == AnimationStatus.dismissed) + return; + final ScaffoldFeatureController currentSnackbar = _snackBars.first; + _snackBars.clear(); + _snackBars.add(currentSnackbar); + hideCurrentSnackBar(); + } + @override Widget build(BuildContext context) { assert(debugCheckHasMediaQuery(context)); diff --git a/packages/flutter/test/material/snack_bar_test.dart b/packages/flutter/test/material/snack_bar_test.dart index c25b708275..9c22275c3f 100644 --- a/packages/flutter/test/material/snack_bar_test.dart +++ b/packages/flutter/test/material/snack_bar_test.dart @@ -2323,4 +2323,54 @@ void main() { final Offset snackBarTopRight = tester.getTopRight(find.byType(SnackBar)); expect(snackBarTopRight.dy, 465.0); }); + + testWidgets('ScaffoldMessengerState clearSnackBars works as expected', (WidgetTester tester) async { + final List snackBars = ['Hello Snackbar', 'Hi Snackbar', 'Bye Snackbar']; + int snackBarCounter = 0; + const Key tapTarget = Key('tap-target'); + final GlobalKey scaffoldMessengerKey = GlobalKey(); + + await tester.pumpWidget(MaterialApp( + home: ScaffoldMessenger( + key: scaffoldMessengerKey, + child: Scaffold( + body: Builder( + builder: (BuildContext context) { + return GestureDetector( + key: tapTarget, + onTap: () { + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(snackBars[snackBarCounter++]), + duration: const Duration(seconds: 2), + )); + }, + behavior: HitTestBehavior.opaque, + child: Container( + height: 100.0, + width: 100.0, + ), + ); + } + ), + ), + ), + )); + expect(find.text(snackBars[0]), findsNothing); + expect(find.text(snackBars[1]), findsNothing); + expect(find.text(snackBars[2]), findsNothing); + await tester.tap(find.byKey(tapTarget)); + await tester.tap(find.byKey(tapTarget)); + await tester.tap(find.byKey(tapTarget)); + expect(find.text(snackBars[0]), findsNothing); + expect(find.text(snackBars[1]), findsNothing); + expect(find.text(snackBars[2]), findsNothing); + await tester.pump(); // schedule animation + expect(find.text(snackBars[0]), findsOneWidget); + scaffoldMessengerKey.currentState!.clearSnackBars(); + expect(find.text(snackBars[0]), findsOneWidget); + await tester.pump(const Duration(seconds: 2)); + expect(find.text(snackBars[0]), findsNothing); + expect(find.text(snackBars[1]), findsNothing); + expect(find.text(snackBars[2]), findsNothing); + }); }