Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振:移除所有防震条_Flutter - Fatal编程技术网

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);     
}