等待一些结果,然后再通过flutter_bloc库调度事件

时间:2019-05-27 08:49:24

标签: flutter dart bloc

我正在尝试创建一个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()

1 个答案:

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