我正在尝试创建一个BLOC,该BLOC依赖于其他两个基于时间的集团和一个基于非时间的集团。我所说的基于时间的意思是,例如,他们正在连接远程服务器,因此需要时间。就是这样工作的:
登录(当然需要一些时间)
如果登录成功
执行另一个过程(这也需要时间。它会返回未来。)
登录并完成另一个过程后,让页面知道它。
我的BLOC取决于以下三个:
final UserBloc _userBloc;
final AnotherBloc _anotherBloc;
final FinishBloc _finishBloc;
在状态方法的map事件中,我应该调度相关事件。但是,我等不及他们是否完成。
_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());
}
},
);
}
,然后在将bool设置为true之后,为main bloc调度另一个事件,以检查所有bool是否都是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());
}
}
我对这段代码不满意。我正在寻找一种等待其他BLOC发送“完成”状态的方法。之后,我想调度我的LetThePageKnowIt()
答案 0 :(得分:1)
@pskink的建议解决了我的问题。
我创建了两个返回未来的方法。在他们里面,我只是在等待我的流。这是登录流的示例。
在要声明的地图事件中,在分派之后,我等待一个异步方法。
_userBloc.dispatch(
Login(),
);
_anotherBloc.dispatch(
AnotherProcess(),
);
await loginProcess();
await otherProcess();
_finishBloc.dispatch(
LetThePageKnowIt(),
);
在方法中,我只是等待userbloc完成其工作并产生收益。然后返回。
Future loginProcess() async {
await for (var result in _userBloc.state) {
if (result.status == Status.finished) {
return;
}
}
}