Added clearSnackBars method to ScaffoldMessengerState (#76146)
This commit is contained in:
parent
3594d1aa47
commit
aa16a8cac0
@ -432,6 +432,17 @@ class ScaffoldMessengerState extends State<ScaffoldMessenger> with TickerProvide
|
|||||||
_snackBarTimer = null;
|
_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
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
assert(debugCheckHasMediaQuery(context));
|
assert(debugCheckHasMediaQuery(context));
|
||||||
|
@ -2323,4 +2323,54 @@ void main() {
|
|||||||
final Offset snackBarTopRight = tester.getTopRight(find.byType(SnackBar));
|
final Offset snackBarTopRight = tester.getTopRight(find.byType(SnackBar));
|
||||||
expect(snackBarTopRight.dy, 465.0);
|
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);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user