Flutter:删除所有 SnackBar

Ser*_*sly 6 flutter

在我的应用程序中,有可能(并且有意!)SnackBar创建多个元素。这些SnackBar元素依次排队并显示,一切都很好。但是,如果我转到不同的屏幕然后返回(因此pushpop一条路线),所有SnackBar元素仍然存在。

所以我想SnackBar在推送路线时删除所有 s 。

我尝试计算我的SnackBar元素并scaffoldKey.currentState.removeCurrentSnackBar()在以下位置多次调用:

  • 然而,在此之前Navigator.push(),由于我有多个点推送某些内容,所以我想使用一些回调。

  • 然而,在didPushRoute()from中WidgetsBindingObserver,即使在注册观察者之后,也永远不会调用此方法。(ChangeAppLifecycleState()被调用所以注册似乎并没有完全错误?)

  • dispose()。这实际上产生了我想要的行为,但抛出了异常AnimatedBuilder(异常文本:“ setState() or markNeedsBuild() called during build.”),我想避免这种情况,即使动画库似乎捕获了这些异常。

如果一切都失败了,我想我可以包装Navigator.push()一个辅助函数来清除SnackBar队列,但我希望有一种更优雅的方式。

Mad*_*oop 9

您可以使用它来删除 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)


Hug*_*o H 5

要清除所有s,可以在包装器中使用SnackBar一种方法。:-)ScaffoldMessenger.of(context).clearSnackBars()pushNamed


Ser*_*sly 0

所以,最后,我最终编写了以下函数并在各处调用它,而不是 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)