【问题标题】:Flutter BLoC multiple BLoCs same widgetFlutter BLoC 多个 BLoC 相同的小部件
【发布时间】:2019-12-10 02:11:38
【问题描述】:

我对 Flutter 和 BLoC 模式还比较陌生,所以我仍在努力解决所有问题。

假设我有一个测验应用程序,其中有一个名为 QuestionBloc 的 BLoC,它使用存储库从文件中获取问题。 QuestionBloc上的事件

  • FetchQuestion

QuestionBloc 上的状态

  • QuestionEmpty
  • QuestionLoading
  • QuestionLoaded 包含一个问题对象
  • QuestionError

然后我有另一个名为QuestionValidatorBloc 的 BLoC,它负责验证问题的答案。答案被输入到文本字段中,并且有一个提交按钮来触发验证。 QuestionValidatorBloc上的事件

  • ValidateQuestion

QuestionValidatorBloc 上的状态

  • ValidateInitial
  • ValidateInProgress
  • ValidateSuccess
  • ValidateError

这是相当直截了当的。但是,现在我需要将QuestionBlocQuestionValidatorBloc 合并到同一个小部件中,因为其中一个负责获取和显示问题,另一个负责处理验证操作。我怎样才能做到这一点?

【问题讨论】:

  • 如果您只使用一个 BloC 和 2 个或更多主题怎么办?您正在使用相同的小部件。因此,最好只有一个 BLoC 和需要的流构建器
  • 将两个不同的工作分成两个集团是积极的。我看到很多人一页一页地告诉一个集团,但我认为他们没有看到更复杂的用例。在这种情况下,validationapi call 是完全不同的工作,我不知道为什么使用一个更好。
  • 如果我在这个集团内部需要另一个集团怎么办?我说的是在 bloc 内部使用 2+ bloc。我可能会有 2 个订阅,但我将如何嵌套呢?另一个状态监听器中的状态监听器是不好的方法:/我被卡住了

标签: flutter dart bloc


【解决方案1】:

我假设您使用的是 flutter_bloc 库。让QuestionBloc 使用StreamSubscription 收听QuestionValidatorBloc

class QuestionBloc extends Bloc<QuestionEvent, QuestionState> {
  QuestionValidatorBloc questionValidatorBloc;
  StreamSubscription subscription;

  MainPageBloc({@required this.questionValidatorBloc}) {
    subscription= questionValidatorBloc.state.listen((state) {
      if (state is ValidateSuccess) {
        dispatch(YourEvent());
      } else if(state is ValidateError{
        dispatch(AnotherEvent());
      }
    });
  }

...

现在您只需将QuestionValidatorBloc 传递给QuestionBloc 构造函数。

【讨论】:

  • 如果我在这个集团内部需要另一个集团怎么办?我说的是在 bloc 内部使用 2+ bloc。我可能会有 2 个订阅,但我将如何嵌套呢?另一个状态监听器中的状态监听器是不好的方法:/ 我被卡住了
  • @fkvestak 你明白了吗?
  • @Spectarion 不,我不再使用 bloc,你应该尝试 mobx
  • @AnisAlibegić 因为bloc.stateStream,您可以将多个流组合在一起,然后将流的组合作为单个Stream 对象收听。如果 dart 没有任何东西,那么 rxdart 库肯定有
猜你喜欢
  • 2020-12-29
  • 2021-06-17
  • 2020-07-18
  • 2020-09-26
  • 1970-01-01
  • 2021-03-19
  • 2020-05-06
  • 2019-05-23
  • 2021-04-20
相关资源
最近更新 更多