在使用 flutter_bloc 库发送事件之前等待一些结果
Awaiting some results before dispatching an event with flutter_bloc library
我正在尝试创建一个 BLOC,它依赖于另外两个基于时间的 bloc 和一个非基于时间的 bloc。我所说的基于时间的意思是,例如,他们正在连接远程服务器,所以这需要时间。它的工作原理是这样的:
登录(当然需要一些时间)
如果登录成功
再做一个流程(这也是需要时间的事情,returns一个未来。)
登录和另一个进程完成后,让页面知道它。
我的 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(),
);
有没有一种干净的方法可以在发送之前等待其他人?
我知道我使用了一种我不喜欢的方式。在我连接其他集团的主要集团状态下,我有布尔值。
class CombinerState {
bool isLoginFinished = false;
bool isAnotherProcessFinished = false;
我正在主区块的构造函数中监听时间相关区块的状态。当它们产生 "i am finished" 时,我只标记 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());
}
},
);
}
我为 main bloc 发送另一个事件,以在将 bool 设置为 true 后检查所有 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 发送带有 "finished" 的状态。之后我想发送我的 LetThePageKnowIt()
@pskink 的建议解决了我的问题。
我创建了两个 return 未来的方法。在他们里面,我只是在等待我的信息流。这是登录流的例子。
在事件到状态的映射中,在分派之后,我等待一个异步方法。
_userBloc.dispatch(
Login(),
);
_anotherBloc.dispatch(
AnotherProcess(),
);
await loginProcess();
await otherProcess();
_finishBloc.dispatch(
LetThePageKnowIt(),
);
在方法中,我只是等待 userbloc 完成它的工作并产生它。然后return.
Future loginProcess() async {
await for (var result in _userBloc.state) {
if (result.status == Status.finished) {
return;
}
}
}
我正在尝试创建一个 BLOC,它依赖于另外两个基于时间的 bloc 和一个非基于时间的 bloc。我所说的基于时间的意思是,例如,他们正在连接远程服务器,所以这需要时间。它的工作原理是这样的:
登录(当然需要一些时间)
如果登录成功
再做一个流程(这也是需要时间的事情,returns一个未来。)
登录和另一个进程完成后,让页面知道它。
我的 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(),
);
有没有一种干净的方法可以在发送之前等待其他人?
我知道我使用了一种我不喜欢的方式。在我连接其他集团的主要集团状态下,我有布尔值。
class CombinerState {
bool isLoginFinished = false;
bool isAnotherProcessFinished = false;
我正在主区块的构造函数中监听时间相关区块的状态。当它们产生 "i am finished" 时,我只标记 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());
}
},
);
}
我为 main bloc 发送另一个事件,以在将 bool 设置为 true 后检查所有 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 发送带有 "finished" 的状态。之后我想发送我的 LetThePageKnowIt()
@pskink 的建议解决了我的问题。
我创建了两个 return 未来的方法。在他们里面,我只是在等待我的信息流。这是登录流的例子。
在事件到状态的映射中,在分派之后,我等待一个异步方法。
_userBloc.dispatch(
Login(),
);
_anotherBloc.dispatch(
AnotherProcess(),
);
await loginProcess();
await otherProcess();
_finishBloc.dispatch(
LetThePageKnowIt(),
);
在方法中,我只是等待 userbloc 完成它的工作并产生它。然后return.
Future loginProcess() async {
await for (var result in _userBloc.state) {
if (result.status == Status.finished) {
return;
}
}
}