避免在BLoC和RxDart中重复

时间:2018-08-13 15:18:07

标签: 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();
  }
}

2 个答案:

答案 0 :(得分:3)

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

Use of future reserved word in strict mode

第二,您要解决的问题实际上不是问题。起初似乎有很多重复项;实际上,它们有不同的用途。

在许多情况下,您的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(); } } 不仅会Stream。例如,出于任何原因,您可能想要在暴露值之前先对其进行转换:

_controller.stream

此代码使final mainController = BehaviorSubject(seedValue: false); final Stream<bool> output = mainController.map((foo) => !foo); 流反转传递给output的所有内容的值

但是在我的情况下并非如此。那么,为什么3个变量指向同一事物呢?

在您所处的环境中,您的控制器既是接收器又是流而无需进行转换,这是一个实现细节,并且可能会发生更改。

通过像以前一样公开mainController.sink / Sink,实际上可以抽象出此实现细节。以便将来您的流需要自定义操作时;您的用户界面无需更改。

这不是必需的。但是推荐。

答案 1 :(得分:1)

您可以执行以下操作:)

  enum STREAM_GROUP {
    TYPE1,TYPE2,TYPE3
  }

  class BlocExample {

        Map<STREAM_GROUP, StreamController<bool>> groups = new Map();

        Stream<bool> getValue(STREAM_GROUP type){
          return groups[type].stream;
        }
        Sink<bool> getValueSetting(STREAM_GROUP type){
          return groups[type].sink;
        }

        BlocExample() {
          groups[STREAM_GROUP.TYPE1] = StreamController<bool>();
          groups[STREAM_GROUP.TYPE2] = StreamController<bool>();
          groups[STREAM_GROUP.TYPE3] = StreamController<bool>();

          groups.forEach((groupType, streamController){
              final currentValue = BehaviorSubject<bool>(seedValue: false);
              streamController.stream.listen(currentValue.add);
          });


        }

        void dispose() {
           groups.forEach((groupType, streamController){
              streamController.close();
          });
        }
      }