Ожидание некоторых результатов перед отправкой события с библиотекой flutter_bloc

Я пытаюсь создать БЛОК, который зависит от двух других блоков, основанных на времени, и блока, не основанного на времени. Что я имею в виду под временем, например, они подключаются к удаленному серверу, поэтому это требует времени. Это работает примерно так:

Войти (Конечно, это займет некоторое время)

Если вход прошел успешно

Выполните другой процесс (Это тоже требует времени. Это возвращает будущее.)

После входа в систему и завершения другого процесса сообщите об этом странице.

Мой БЛОК зависит от этих трех:

final UserBloc _userBloc;
final AnotherBloc _anotherBloc;
final FinishBloc _finishBloc;

Внутри метода map event to state я должен отправлять соответствующие события. Однако я не могу дождаться, когда они закончатся.

_userBloc.dispatch(
  Login(),
);

_anotherBloc.dispatch(
  AnotherProcess(),
);

//LetThePageKnowIt should work after login and another process
_finishBloc.dispatch(
  LetThePageKnowIt(),
);

Есть ли чистый способ дождаться некоторых других перед отправкой чего-либо?

Точно знаю, что я использую способ, который мне не нравится. В состоянии основного блока, к которому я подключаю другие блоки, у меня есть логические значения.

class CombinerState {
  bool isLoginFinished = false;
  bool isAnotherProcessFinished = false;

Я слушаю состояния блоков, зависящих от времени, в конструкторе основного блока. Когда они дают «я закончил», я просто отмечаю логические значения «true».

MainBloc(
  this._userBloc,
  this._anotherBloc,
  this._pageBloc,
); {
  _userBloc.state.listen(
    (state) {
      if (state.status == Status.finished) {
        dispatch(FinishLogin());
      }
    },
  );

  _anotherBloc.state.listen(
    (state) {
      if (state.status == AnotherStatus.finished) {
        dispatch(FinishAnotherProcess());
      }
    },
  );
}

и я отправляю другое событие для основного блока, чтобы проверить, истинны ли все логические значения после установки логического значения в значение true.

else if (event is FinishAnotherProcess) {
  newState.isAnotherProcessFinished = true;

  yield newState;

  dispatch(CheckIfReady());
}

Если логические значения верны, я отправляю LetThePageKnowIt()

else if (event is CheckIfReady) {
  if (currentState.isAnotherProcessFinished == true &&
      currentState.isLoginFinished == true) {
    _pageBloc.dispatch(LetThePageKnowIt());
  }
}

Меня не устраивает этот код. Я ищу способ дождаться, когда другие блоки отправят состояние с «завершено». После этого я хочу отправить свой LetThePageKnowIt()

вы не можете сделать один метод асинхронный, который обрабатывает все ваши шаги?

pskink 27.05.2019 11:05

Что вы подразумеваете под одним асинхронным методом? Если вы говорите об отправке событий асинхронным методом, метод сопоставления событий с состоянием уже является асинхронным.

Mansur 27.05.2019 11:07

я имею в виду ваши шаги, такие как: Login (It's of course taking some time) If login is successful Do another process (This is something takes time also. It returns a future.) - просто прочитайте свой «поток входа в систему», а когда закончите, сделайте свой второй шаг

pskink 27.05.2019 11:10

Может быть, вам следует написать ответ с некоторым кодом. Я не понимаю ясно.

Mansur 27.05.2019 11:14

просто используйте ждать при чтении вашего «потока входа» - когда закончите, просто верните Future, который вы получили на втором «шаге» (что бы это ни было)

pskink 27.05.2019 11:16

что-то вроде: Future myMethod() async { await for (var loginItem in loginStream) { do something with loginItem }; return anotherProcess(); }

pskink 27.05.2019 11:41

не стесняйтесь публиковать ответ на свой вопрос...

pskink 27.05.2019 11:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
7
3 663
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предложение @pskink решило мою проблему.

Я создал два метода, которые возвращают будущее. Внутри них я просто жду своих потоков. Вот пример потока входа.

В событии карты для состояния после отправки я жду асинхронного метода.

_userBloc.dispatch(
  Login(),
);

_anotherBloc.dispatch(
  AnotherProcess(),
);

await loginProcess();
await otherProcess();

_finishBloc.dispatch(
  LetThePageKnowIt(),
);

Внутри метода я просто жду, пока пользовательский блок завершит свою работу и даст об этом ответ. Затем вернитесь.

Future loginProcess() async {
  await for (var result in _userBloc.state) {
    if (result.status == Status.finished) {
      return;
    }
  }
}

Другие вопросы по теме