Проверка состояния задержки внутри слушателя блока Flutter
Я отправляю данные на сервер через блок и показываю 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...
),
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...
),
Просто используйте Future.delayed()
Здесь пример кода выдает состояние после некоторой задержки, проверяя, что его следует ожидать.
if (event is LoadDataEvent) {
emit(LoadingState());
await Future.delayed(const Duration(seconds: 3));
emit(SuccessState());
}
Ты можешь сделать Future.delay()
в твоем state is UpdatingAccount
состояние и проверьте состояние еще раз.
if (state is UpdatingAccount) {
Future.delayed(Duration(seconds: 1), (){
if(state is "UpdatingAccount"){
Scaffold.of(context)
..hideCurrentSnackBar()
..showSnackBar(progressSnackBar());
}
});
}