Flutter 颤振:移除所有防震条
在我的应用程序中,有可能(也有可能!)创建多个Flutter 颤振:移除所有防震条,flutter,Flutter,在我的应用程序中,有可能(也有可能!)创建多个SnackBar元素。这些SnackBar元素一个接一个地排队和显示,一切都很好。但是,如果我转到另一个屏幕,然后返回(因此push和popa route),所有SnackBar元素仍然存在 因此,我希望在推送路线时删除所有的SnackBars 我尝试在以下位置多次计算我的SnackBar元素并调用scaffoldKey.currentState.removeCurrentSnackBar(): 在Navigator.push()之前,它可以工作,
SnackBar
元素。这些SnackBar
元素一个接一个地排队和显示,一切都很好。但是,如果我转到另一个屏幕,然后返回(因此push
和pop
a route),所有SnackBar
元素仍然存在
因此,我希望在推送路线时删除所有的SnackBar
s
我尝试在以下位置多次计算我的SnackBar
元素并调用scaffoldKey.currentState.removeCurrentSnackBar()
:
- 在
之前,它可以工作,但是,因为我有多个点可以推送某些东西,所以我想使用一些回调Navigator.push()
- 然而,在
的WidgetsBindingObserver
中,即使注册了观察者,也不会调用此方法。(didPushRoute()
被调用,因此注册似乎没有完全错误?)ChangeAppLifecycleState()
- 在
中。这实际上产生了我想要的行为,但是抛出了来自dispose()
的异常(异常文本:“AnimatedBuilder
”),这是我想要避免的,即使动画库似乎捕捉到了这些异常setState()或markNeedsBuild(),在生成过程中调用。
如果一切都失败了,我想我可以将
Navigator.push()
包装到一个helper函数中,该函数也可以清除SnackBar
队列,但我希望有一种更优雅的方式。因此,最后,我编写了以下函数,并在任何地方调用它,而不是Navigator.pushNamed()
Future<T> _pushNamedWrapper<T extends Object>(
BuildContext context,
String routeName, {
Object arguments,
}) {
for (int snackbarsLeft = _snackbarCounter;
snackbarsLeft > 0;
snackbarsLeft = snackbarsLeft - 1) {
_scaffoldKey.currentState.removeCurrentSnackBar();
}
return Navigator.pushNamed(context, routeName, arguments: arguments);
}
// function where you want your snackbar to be triggered
() {
_snackbarCounter = _snackbarCounter + 1;
Scaffold.of(context)
.showSnackBar(SnackBar(
content: // your content...
))
.closed
.then((SnackBarClosedReason reason) =>
_snackbarCounter = _snackbarCounter - 1);
}