Flutter 在使用Flatter_bloc库调度事件之前等待一些结果
我试图创建一个集团,它依赖于另外两个基于时间的集团和一个非基于时间的集团。我的意思是基于时间的,例如,他们正在连接远程服务器,所以这需要时间。它是这样工作的: 登录(当然需要一些时间) 如果登录成功 做另一个过程(这也是需要时间的,它会返回一个未来。) 在登录和另一个过程完成后,让页面知道它 我的阵营取决于以下三点:Flutter 在使用Flatter_bloc库调度事件之前等待一些结果,flutter,dart,bloc,Flutter,Dart,Bloc,我试图创建一个集团,它依赖于另外两个基于时间的集团和一个非基于时间的集团。我的意思是基于时间的,例如,他们正在连接远程服务器,所以这需要时间。它是这样工作的: 登录(当然需要一些时间) 如果登录成功 做另一个过程(这也是需要时间的,它会返回一个未来。) 在登录和另一个过程完成后,让页面知道它 我的阵营取决于以下三点: final UserBloc _userBloc; final AnotherBloc _anotherBloc; final FinishBloc _finishBloc; 在
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;
我在主阵营的构造器中收听时间相关阵营的状态。当他们说“我完成了”时,我只是把布尔标记为“真”
在将bool设置为true之后,我向main bloc发送另一个事件来检查所有bool是否为true
else if (event is FinishAnotherProcess) {
newState.isAnotherProcessFinished = true;
yield newState;
dispatch(CheckIfReady());
}
如果bools是真的,我会让页面知道它()
我对这个代码不满意。我正在寻找一种方法,等待其他集团发送一个“已完成”的状态。之后,我想发送我的LetThePageKnowIt()@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;
}
}
}
您不能创建一个异步方法来处理所有步骤吗?一个异步方法是什么意思?如果您谈论的是在异步方法中调度事件,那么将事件映射到状态的方法已经是异步的。我的意思是,您的步骤如下:
登录(这当然需要一些时间)如果登录成功,请执行另一个过程(这也需要一些时间。它返回一个未来)。
-只要读取“登录流”完成第二步后,只需在读取“登录流”时使用即可-完成后,只需返回从第二步(无论是什么)中获得的Future
,例如:Future myMethod()async{wait for(loginStream中的var loginItem){使用loginItem做点什么};返回另一个进程();}
_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;
}
}
}