Flutter BLoC 多个 BLoC 在同一个 widget 中

14
我对Flutter和BLoC模式比较新,仍在努力理解一切。
假设我有一个测验应用程序,其中有一个名为QuestionBloc的BLoC,它使用存储库从文件中获取问题。 在QuestionBloc上的事件:
  • FetchQuestion
QuestionBloc上的状态:
  • QuestionEmpty
  • QuestionLoading
  • QuestionLoaded包含一个问题对象
  • QuestionError
然后我有另一个名为QuestionValidatorBloc的BLoC,它负责验证问题的答案。答案输入到文本字段中,有一个提交按钮来触发验证。 在QuestionValidatorBloc上的事件:
  • ValidateQuestion
QuestionValidatorBloc上的状态:
  • ValidateInitial
  • ValidateInProgress
  • ValidateSuccess
  • ValidateError
这相当简单。然而,现在我需要将QuestionBlocQuestionValidatorBloc都合并到同一个小部件中,因为其中一个负责获取和显示问题,另一个则处理验证操作。我如何才能实现这一点?

如果您只使用一个BLoC,而且有2个或更多的主题怎么办?您正在使用相同的小部件。因此最好只有一个BLoC和需要的流构建器。 - Sergio Bernal
2
将两个不同的任务分成两个块在我看来是积极的。我看到很多人建议一个页面只使用一个块,但我认为他们没有看到更复杂的用例。在这种情况下,“验证”和“API调用”是完全不同的任务,我不知道为什么使用一个块会更好。 - Tokenyet
如果我需要在这个块内部再添加一个块怎么办?我的意思是在块内使用2个或更多的块。我可能会有2个订阅,但如何嵌套它们呢?在另一个状态监听器中使用状态监听器是不好的方法 :/ 我卡住了。 - fkvestak
1个回答

5

我假设您正在使用 flutter_bloc 库。使用 StreamSubscription,让 QuestionBloc 监听 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构造函数即可。

2
如果我需要在这个块内部再添加一个块怎么办? 我指的是在块内使用2个或更多的块。我可能会有2个订阅,但如何嵌套它们呢?在另一个状态监听器中使用状态监听器是不好的方法 :/ 我卡住了。 - fkvestak
@fkvestak 你解决了吗? - Anis Alibegić
@Spectarion 不是的,我不再使用 bloc 了,你应该尝试使用 mobx。 - fkvestak
@AnisAlibegić,由于bloc.state是一个Stream,您可以将多个流组合在一起,然后将其作为单个Stream对象的组合进行监听。如果Dart没有这样的功能,那么rxdart库肯定有。 - alireza easazade

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接