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;
    }
  }
}