Проверка состояния задержки внутри слушателя блока 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());
    }
  });
}
Другие вопросы по тегам