mirror of
https://github.com/flutter/flutter
synced 2024-10-14 04:02:56 +00:00
Remove periodic timer from Scaffold snackbar logic (#20317)
This commit is contained in:
parent
db58c665a3
commit
5177a37fe2
|
@ -1075,6 +1075,7 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin {
|
|||
final Queue<ScaffoldFeatureController<SnackBar, SnackBarClosedReason>> _snackBars = new Queue<ScaffoldFeatureController<SnackBar, SnackBarClosedReason>>();
|
||||
AnimationController _snackBarController;
|
||||
Timer _snackBarTimer;
|
||||
bool _accessibleNavigation;
|
||||
|
||||
/// Shows a [SnackBar] at the bottom of the scaffold.
|
||||
///
|
||||
|
@ -1396,6 +1397,23 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin {
|
|||
super.didUpdateWidget(oldWidget);
|
||||
}
|
||||
|
||||
@override
|
||||
void didChangeDependencies() {
|
||||
final MediaQueryData mediaQuery = MediaQuery.of(context);
|
||||
// If we transition from accessible navigation to non-accessible navigation
|
||||
// and there is a SnackBar that would have timed out that has already
|
||||
// completed its timer, dismiss that SnackBar. If the timer hasn't finished
|
||||
// yet, let it timeout as normal.
|
||||
if (_accessibleNavigation == true
|
||||
&& !mediaQuery.accessibleNavigation
|
||||
&& _snackBarTimer != null
|
||||
&& !_snackBarTimer.isActive) {
|
||||
hideCurrentSnackBar(reason: SnackBarClosedReason.timeout);
|
||||
}
|
||||
_accessibleNavigation = mediaQuery.accessibleNavigation;
|
||||
super.didChangeDependencies();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_snackBarController?.dispose();
|
||||
|
@ -1482,20 +1500,20 @@ class ScaffoldState extends State<Scaffold> with TickerProviderStateMixin {
|
|||
final MediaQueryData mediaQuery = MediaQuery.of(context);
|
||||
final ThemeData themeData = Theme.of(context);
|
||||
final TextDirection textDirection = Directionality.of(context);
|
||||
_accessibleNavigation = mediaQuery.accessibleNavigation;
|
||||
|
||||
if (_snackBars.isNotEmpty) {
|
||||
final ModalRoute<dynamic> route = ModalRoute.of(context);
|
||||
if (route == null || route.isCurrent) {
|
||||
if (_snackBarController.isCompleted && _snackBarTimer == null) {
|
||||
final SnackBar snackBar = _snackBars.first._widget;
|
||||
_snackBarTimer = new Timer.periodic(snackBar.duration, (Timer timer) {
|
||||
_snackBarTimer = new Timer(snackBar.duration, () {
|
||||
assert(_snackBarController.status == AnimationStatus.forward ||
|
||||
_snackBarController.status == AnimationStatus.completed);
|
||||
// Look up MediaQuery again in case the setting changed.
|
||||
final MediaQueryData mediaQuery = MediaQuery.of(context);
|
||||
if (mediaQuery.accessibleNavigation && snackBar.action != null)
|
||||
return;
|
||||
timer.cancel();
|
||||
hideCurrentSnackBar(reason: SnackBarClosedReason.timeout);
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue