是否允许从一个块内部将事件添加到另一个块?

use*_*783 4 state-management dart flutter bloc

我正在使用blocDart 中可用的库来实现“块”模式。我最终将转向flutter_bloc库,这样我就可以在真正的应用程序中使用它。

我在理解如何创建一些可以从更专业的块中调用的通用块时遇到了一些困难。我所说的专门化是指某个可能管理特定视图的集团。然后,一般集团将负责调用 API,甚至可能按顺序执行多项操作。

所以我的想法是,也许我有一个StateA管理特定模型的方法,因此我使用BlocA. 每当添加某个事件时BlocA,我还需要更新StateBBlocB. 我不想在同一块内执行此操作,因为这些不同的状态包含可能不相关的不同数据。也许我可以将BlocC其用于应用程序的特定部分,但某些事件也应该调用 和 中的事件和状态BlocA更改BlocB

我正在考虑BlocA这样写块:

class BlocA extends BlocBase<BlocAEvent, BlocAState>  {
  BlocA(BlocB blocB) : super(BlocAState()) {
    _blocB = blocB;
    _blocARepository = BlocARepository();
  };

  BlocARepository _blocARepository;

  @override
  BlocAState mapEventToState(BlocAEvent event) async* {
    if (event is BlocAEventOne) {
      yield state.copyWith(valueOne: event.value);
    } else if (event is BlocAEventTwo {
      // Get data related to BlocAState
      final data = await _blocARepository.fetchImportantData()
      // ! <-- I also need to fetch additional data but that is managed
      // by different bloc - BlocB
      _blocB.add(BlocBEventOne(id: data.id));
      yield state.copyWith(dataList: SomeModel.fromJSON(data));
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后像BlocB这样创建常规块:

class BlocB extends BlocBase<BlocBEvent, BlocBState>  {
  BlocB() : super(BlocBState()) {
    _blocBRepository = BlocBRepository();
  };

  BlocBRepository _blocBRepository;

  @override
  BlocBState mapEventToState(BlocBEvent event) async* {
    if (event is BlocBEventOne) {
      // Get data related to BlocBState
      final data = await _blocBRepository.fetchOtherData(event.id)
      yield state.copyWith(dataList: SomeOtherModel.fromJSON(data));
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我真的不确定这是否是正确的方法,因为基本上BlocA添加了另一个事件。但我正在尝试做一些可重用的块并使数据更加独立。我知道我也可以加入,_blocB.stream.listen但这BlocA只能让我了解该BlocB集团的状况。我需要的是对某些事件做出反应的能力。

您认为我的方法可能很复杂并且使用BlocObserver可能更合适吗?问题BlocObserver是我不确定如何在 Flutter 应用程序中正确使用它。

mko*_*lys 12

首先,您想要实现的目标完全没问题,但让我们稍微讨论一下架构。

一种选择可能是 BLoC B 订阅 BLoC A 状态更改并相应地进行处理。例如,这里一个更具体的 BLoC 订阅了一个更通用的 BLoC 的更改:https://github.com/felangel/bloc/blob/08200a6a03e37ce179cef10b65f34ddf6f43f936/examples/flutter_todos/lib/blocs/filtered_todos/filtered_todos_bloc.dart。为此,您需要稍微调整 BLoC A 状态(以便您可以识别此特定更改/事件),这可能不是一个可行的方法。

您应该考虑的另一件事是您是否想要紧密耦合 BLoC(在示例中,BLoC B 引用通过构造函数传递给 BLoC A)。为此,您可以创建某种在内部使用流的中介类:BLoC A 可以将事件发布到该中介类接收器,所有订阅者将通过公开的流接收该事件(在您的情况下 - BLoC B 应该订阅该流) - 所以那里的通信就像 BLoC A -> Mediator -> BLoC B。 这基本上就是 Mediator/Observer OOP 设计模式解决的问题。其优点是您的 BLoC 不会互相了解任何信息,多个 BLoC 可以订阅多个不同的事件流,这意味着您可以随时向事件添加更多订阅者 (BLoC)。

  • 我在这里用示例代码描述了中介者设计模式:https://mkobuolys.medium.com/flutter-design-patterns-22-mediator-575e7aa6bfa9 和观察者在这里:https://mkobuolys.medium.com/flutter-设计模式-23-观察者-1e1b0ea81d73 (2认同)