在我的应用程序中,有可能(并且有意!)SnackBar创建多个元素。这些SnackBar元素依次排队并显示,一切都很好。但是,如果我转到不同的屏幕然后返回(因此push和pop一条路线),所有SnackBar元素仍然存在。
所以我想SnackBar在推送路线时删除所有 s 。
我尝试计算我的SnackBar元素并scaffoldKey.currentState.removeCurrentSnackBar()在以下位置多次调用:
然而,在此之前Navigator.push(),由于我有多个点推送某些内容,所以我想使用一些回调。
然而,在didPushRoute()from中WidgetsBindingObserver,即使在注册观察者之后,也永远不会调用此方法。(ChangeAppLifecycleState()被调用所以注册似乎并没有完全错误?)
在dispose()。这实际上产生了我想要的行为,但抛出了异常AnimatedBuilder(异常文本:“ setState() or markNeedsBuild() called during build.”),我想避免这种情况,即使动画库似乎捕获了这些异常。
如果一切都失败了,我想我可以包装Navigator.push()一个辅助函数来清除SnackBar队列,但我希望有一种更优雅的方式。
您可以使用它来删除 Flutetr2 中的 Snackbar
ScaffoldMessenger.of(context).removeCurrentSnackBar();
示例代码
onPressed: () {
ScaffoldMessenger.of(context).removeCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('New Snackbar'),
),
);
}
Run Code Online (Sandbox Code Playgroud)
所以,最后,我最终编写了以下函数并在各处调用它,而不是 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);
}
Run Code Online (Sandbox Code Playgroud)
这里,_snackbarCounter是一个计数器变量,每当创建小吃店时都会增加它,或者在它消失时减少。大致是这样的:
// 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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4427 次 |
| 最近记录: |