有多个流的Flutter Bloc?

时间:2019-09-22 10:49:24

标签: flutter dart bloc

我最近听到并阅读了很多有关BLoC体系结构的信息,它很有道理,并且与我以前使用的程序结构相似。

但是,我发现不清楚的一件事是BLoC应该实例化并提供的流。

让我们考虑一下应用程序用户有两个按钮,按下这些按钮将创建两个 distinct 对象,这些对象需要由 distinct < BLoC中的/ em> 方法。我不确定这是否需要创建两个StreamController对象并公开两个接收器,或者它们是否应该共享一个公共StreamController以及操作是否使用运行时类型检查来区分。

这两种方法如下:第一种方法是在BLoC中创建两个流控制器:

  final _actionOneController = StreamController<ActionOne>();
  StreamSink<ActionOne> get actionOne => _actionOneController.sink;

  final _actionTwoController = StreamController<ActionTwo>();
  StreamSink<ActionTwo> get actionTwo => _actionTwoController.sink;

通过将两个事件添加到不同的接收器来创建两个事件:

 Button(child: Text("Action One"), onPressed: () => bloc.actionOne.add(ActionOne(data, data1, data3)),
 Button(child: Text("Action Two"), onPressed: () => bloc.actionTwo.add(ActionTwo(someOtherData)),

并通过分别收听两个流来处理它们。

第二种方法公开了一个StreamSink

  final _actionController = StreamController<Action>();
  StreamSink<Action> get action => _actionController.sink;

通过将两个事件添加到公共接收器中来创建两个事件:

 Button(child: Text("Action One"), onPressed: () => bloc.action.add(ActionOne(data, data1, data3)),
 Button(child: Text("Action Two"), onPressed: () => bloc.action.add(ActionTwo(someOtherData)),

,然后使用一种检查Action对象的运行时类型的方法来区分BLoC中的动作:

void _actionListener(Action action){
  if(action is ActionOne)
    actionOneHandler(action);
  if(action is ActionTwo)
    actionTwoHandler(action);
}

我想强调的是,这两个操作创建的 distinct 对象没有公共字段,即它们不共享公共继承的祖先类。

1 个答案:

答案 0 :(得分:2)

顾名思义,BLoC的核心思想是将UI和业务规则之间的职责分开,因此取决于您要如何构造和组织该逻辑。也许如果您为一个简单的屏幕实现一个块,那么您可以使用一个流,但是随着您的应用变得复杂,您可能需要使用与单个对象相关的逻辑将这些块分解成小块每个屏幕都显示它。

要回答这个问题,事实是要视情况而定,但是正如您强调的那样,这两个动作对待不同的对象有害,建议您在不同的流中处理它,以很好地分离职责。将来,如果您需要重构和维护代码,将会很容易,因为您已经将所有逻辑完全分离了。

此方法的另一个重要优点是,您可以拥有具有所有优点的强类型流,在第二种情况下,操作必须位于同一层次结构中才能添加到同一接收器。

希望有帮助!