Flutter Bloc侦听器内部的延迟状态检查

时间:2019-12-02 16:54:46

标签: flutter dart bloc flutter-bloc

我正在通过集团向服务器发送数据,并在过程中显示progressSnackBar,然后显示successSnackBar。有时,此过程不到一秒钟,因此完全不显示progressSnackBar是有意义的-换句话说, 等待一秒钟,然后检查状态是否仍为UpdatingAccount 。我尝试过涉及Future.delay(...)的不同组合,但都以失败告终,我可能可以进行setState hack攻击,但是有没有办法仅在bloc侦听器内部实现此目的?

BlocListener<AccountBloc, AccountState>(
  listener: (BuildContext context, state) {
    if (state is UpdatingAccount) { // <-- delay this
      Scaffold.of(context)
        ..hideCurrentSnackBar()
        ..showSnackBar(progressSnackBar());
    } else if (state is AccountUpdated) {
      Scaffold.of(context)
        ..hideCurrentSnackBar()
        ..showSnackBar(successSnackBar());
    }
  },
  // rest...
),

2 个答案:

答案 0 :(得分:1)

我最终使该小部件成为有状态的,并为其赋予了_updated bool 成员。

BlocListener<AccountBloc, AccountState>(
  listener: (BuildContext context, state) {
    if (state is UpdatingAccount) {
      _updated = false;
      Future.delayed(Duration(seconds: 1), () {
        if (!_updated) {
          Scaffold.of(context)
            ..hideCurrentSnackBar()
            ..showSnackBar(progressSnackBar());
        }
      });
    } else if (state is AccountUpdated) {
      _updated = true;
      Scaffold.of(context)
        ..hideCurrentSnackBar()
        ..showSnackBar(successSnackBar());
    }
  },
  // rest...
),

答案 1 :(得分:0)

您可以在Future.delay()状态下进行state is UpdatingAccount,然后再次检查状态。

if (state is UpdatingAccount) { 
  Future.delayed(Duration(seconds: 1), (){
    if(state is "UpdatingAccount"){
      Scaffold.of(context)
        ..hideCurrentSnackBar()
        ..showSnackBar(progressSnackBar());
    }
  });
}