Я пытаюсь создать БЛОК, который зависит от двух других блоков, основанных на времени, и блока, не основанного на времени. Что я имею в виду под временем, например, они подключаются к удаленному серверу, поэтому это требует времени. Это работает примерно так:
Войти (Конечно, это займет некоторое время)
Если вход прошел успешно
Выполните другой процесс (Это тоже требует времени. Это возвращает будущее.)
После входа в систему и завершения другого процесса сообщите об этом странице.
Мой БЛОК зависит от этих трех:
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()
Что вы подразумеваете под одним асинхронным методом? Если вы говорите об отправке событий асинхронным методом, метод сопоставления событий с состоянием уже является асинхронным.
я имею в виду ваши шаги, такие как: 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.)
- просто прочитайте свой «поток входа в систему», а когда закончите, сделайте свой второй шаг
Может быть, вам следует написать ответ с некоторым кодом. Я не понимаю ясно.
просто используйте ждать при чтении вашего «потока входа» - когда закончите, просто верните Future
, который вы получили на втором «шаге» (что бы это ни было)
что-то вроде: Future myMethod() async { await for (var loginItem in loginStream) { do something with loginItem }; return anotherProcess(); }
не стесняйтесь публиковать ответ на свой вопрос...
Предложение @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;
}
}
}
вы не можете сделать один метод асинхронный, который обрабатывает все ваши шаги?