2

我通过一个集团向服务器发送数据并显示一个progressSnackBar期间,然后显示一个successSnackBar成功。有时这需要不到一秒钟的时间,根本不显示是有意义的progressSnackBar——换句话说,等待一秒钟,然后检查状态是否仍然存在UpdatingAccount。我已经尝试过不同的组合但失败了Future.delay(...),我可能会做一个setStatehack,但有没有办法在 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...
),
4

2 回答 2

3

我最终使小部件有状态并给它一个_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...
),
于 2019-12-03T07:22:55.917 回答
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());
    }
  });
}
于 2019-12-02T17:47:43.400 回答