避免在BLoC和RxDart中重复

vla*_*chi 5 dart flutter

希望我能说清楚。

在观看视频和教程之后,我发现这种方式使一些小部件可以将数据输入到块(valueSetting)中,而另一些小部件可以将数据输入(值)中。

我要问的是,是否有更好的方法(必须)。我想避免在小部件之间只共享1个实际值的4个变量。

import 'dart:async';

import 'package:rxdart/subjects.dart';

class BlocExample {
  final _valueSettingController = StreamController<bool>();

  // object use by widget to push data
  Sink<bool> get valueSetting => _valueSettingController.sink;

  final _value = BehaviorSubject<bool>(seedValue: false);

  // object used by widget to get data
  Stream<bool> get value => _value.stream;

  BlocExample() {
    _valueSettingController.stream.listen(_value.add);
  }

  void dispose() {
    _value.close();
    _valueSettingController.close();
  }
}
Run Code Online (Sandbox Code Playgroud)

Rém*_*let 3

首先,我要说的是,您可以使用自定义工厂构造函数删除私有变量。这是一个例子:

class MyBloc {
  final Sink<bool> input;
  final Stream<bool> output;
  final VoidCallback _dispose;

  MyBloc._({this.input, this.output, VoidCallback dispose}) : _dispose = dispose;

  factory MyBloc() {
    final mainController = BehaviorSubject(seedValue: false);
    return MyBloc._(
      input: mainController.sink,
      output: mainController.stream,
      dispose: () {
        mainController.close();
      },
    );
  }

  void dispose() {
    _dispose();
  }
}
Run Code Online (Sandbox Code Playgroud)

其次,你试图解决的问题实际上并不是问题。虽然乍一看似乎有很多重复项;实际上它们有不同的目的。

在许多情况下,你的Stream意志不仅仅是_controller.stream。例如,无论出于何种原因,您可能希望在公开该值之前对其进行转换:

final mainController = BehaviorSubject(seedValue: false);

final Stream<bool> output = mainController.map((foo) => !foo);
Run Code Online (Sandbox Code Playgroud)

此代码使output流反转传递给的所有内容的值mainController.sink

但就我的情况而言,情况并非如此。那么为什么 3 个变量指向同一件事呢?

事实上,在您的情况下,您的控制器既是接收器又是流,无需转换,这是一个实现细节,可能会发生变化。

通过像之前那样公开Sink/ ,您实际上抽象了这个实现细节。Stream这样将来如果您的流需要自定义操作;您的 UI 无需进行任何更改。

这是没有必要的。但推荐。