Added clearSnackBars method to ScaffoldMessengerState (#76146)

This commit is contained in:
Chinmoy 2021-03-02 05:35:02 +05:30 committed by GitHub
parent 3594d1aa47
commit aa16a8cac0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 61 additions and 0 deletions

View file

@ -432,6 +432,17 @@ class ScaffoldMessengerState extends State<ScaffoldMessenger> 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<SnackBar, SnackBarClosedReason> currentSnackbar = _snackBars.first;
_snackBars.clear();
_snackBars.add(currentSnackbar);
hideCurrentSnackBar();
}
@override
Widget build(BuildContext context) {
assert(debugCheckHasMediaQuery(context));

View file

@ -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<String> snackBars = <String>['Hello Snackbar', 'Hi Snackbar', 'Bye Snackbar'];
int snackBarCounter = 0;
const Key tapTarget = Key('tap-target');
final GlobalKey<ScaffoldMessengerState> 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);
});
}