在使用 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;
    }
  }
}