颤振集团侦听器内的延迟状态检查



我通过一个块将数据发送到服务器,并在期间显示progressSnackBar,然后在成功时显示successSnackBar。有时这需要不到一秒钟的时间,根本不显示progressSnackBar是有意义的 - 换句话说,等待一秒钟,然后检查状态是否仍然UpdatingAccount。我已经尝试过涉及Future.delay(...)的不同组合并失败了,我可能会做一个setState黑客,但是有没有办法在集团听众内部实现这一目标?

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...
),

我最终使小部件具有状态并给它一个_updated布尔成员。

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...
),

您可以在state is UpdatingAccount条件下执行Future.delay()并再次检查状态。

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

只需使用 Future.delayed((

这里示例代码在一段时间延迟后发出状态,验证它应该等待

if (event is LoadDataEvent) {
emit(LoadingState());
await Future.delayed(const Duration(seconds: 3));
emit(SuccessState());
}

最新更新