Я пытаюсь создать BLOC, который зависит от двух других блоков, основанных на времени, и блока, не основанного на времени. Что я имею в виду, основываясь на времени, например, они подключают удаленный сервер, так что это занимает время. Это работает так:
Логин (конечно, это займет некоторое время)
Если вход в систему успешен
Выполните другой процесс (Это тоже требует времени. Возвращает будущее.)
После входа в систему и завершения другого процесса сообщите об этом странице.
Мой BLOC зависит от этих трех:
final UserBloc _userBloc;
final AnotherBloc _anotherBloc;
final FinishBloc _finishBloc;
Внутри события карты, чтобы указать метод, я должен отправить соответствующие события. Однако я не могу ждать, если они закончены.
_userBloc.dispatch(
Login(),
);
_anotherBloc.dispatch(
AnotherProcess(),
);
//LetThePageKnowIt should work after login and another process
_finishBloc.dispatch(
LetThePageKnowIt(),
);
Есть ли чистый способ ждать некоторых других, прежде чем отправлять что-нибудь?
Точно знаю, я использую способ, который мне не нравится. В состоянии основного блока, к которому я подключаю другие блоки, у меня есть bools.
class CombinerState {
bool isLoginFinished = false;
bool isAnotherProcessFinished = false;
Я слушаю состояния блоков, зависящих от времени, в конструкторе основного блока. Когда они дают «я закончил», я просто отмечаю bools «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());
}
},
);
}
и я отправляю еще одно событие для основного блока, чтобы проверить, все ли bool верны после установки bool в true.
else if (event is FinishAnotherProcess) {
newState.isAnotherProcessFinished = true;
yield newState;
dispatch(CheckIfReady());
}
Если значения bool верны, я отправляю LetThePageKnowIt ()
else if (event is CheckIfReady) {
if (currentState.isAnotherProcessFinished == true &&
currentState.isLoginFinished == true) {
_pageBloc.dispatch(LetThePageKnowIt());
}
}
Я не удовлетворен этим кодом. Я ищу способ ждать, пока другие BLOC отправят состояние с "готово". После этого я хочу отправить свой LetThePageKnowIt ()