避免在集团和RxDart中重复

避免在集团和RxDart中重复,dart,flutter,Dart,Flutter,希望我能说清楚 在视频和教程之后,我发现了这样一种方法,即使用一些小部件将数据输入到bloc(valueSetting),并使用其他一些小部件获取这些数据(value) 我想问的是,是否有更好的方法(必须有…)。我想避免在小部件之间共享一个实际值时需要4个变量 import 'dart:async'; import 'package:rxdart/subjects.dart'; class BlocExample { final _valueSettingController = Str

希望我能说清楚

在视频和教程之后,我发现了这样一种方法,即使用一些小部件将数据输入到bloc(valueSetting),并使用其他一些小部件获取这些数据(value)

我想问的是,是否有更好的方法(必须有…)。我想避免在小部件之间共享一个实际值时需要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();
  }
}
导入'dart:async';
导入“package:rxdart/subjects.dart”;
类BloceSample{
最终_值设置控制器=流控制器();
//小部件用于推送数据的对象
Sink get valueSetting=>\u valueSettingController.Sink;
最终_值=行为主体(种子值:false);
//小部件用于获取数据的对象
流获取值=>\u value.Stream;
BlocExample(){
_valuesetingcontroller.stream.listen(_value.add);
}
无效处置(){
_value.close();
_valueSettingController.close();
}
}

您可以这样做:)

enum流\u组{
类型1,类型2,类型3
}
类BloceSample{
映射组=新映射();
流getValue(流组类型){
返回组[类型]。流;
}
Sink getValueSetting(流组类型){
返回组[类型]。接收器;
}
BlocExample(){
组[STREAM_GROUP.TYPE1]=StreamController();
组[STREAM_GROUP.TYPE2]=StreamController();
组[STREAM_GROUP.TYPE3]=StreamController();
groups.forEach((groupType,streamController){
最终currentValue=BehaviorSubject(种子值:false);
streamController.stream.listen(currentValue.add);
});
}
无效处置(){
groups.forEach((groupType,streamController){
streamController.close();
});
}
}

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

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();
  }
}
此代码使
输出
流反转传递给
mainController.sink的所有内容的值

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

在您的情况下,您的控制器在不进行转换的情况下既是接收器又是流,这是一个实现细节,可能会发生更改

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


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

但这是同样的事情。这并没有减少变量的数量。事实上,使用他的方法,他必须将变量的数量乘以元素的数量。每个控制器仍然有2个getter,尽管我们可以解决这个问题,现在想想10个布尔字段。它不会增加变量的数量,只需将新的枚举值添加到构造函数中就可以了,但并不是所有的接收器/流都适用于相同的类型。每个类型需要一个枚举和映射。你不想强迫你的应用程序使用枚举来访问字段。
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();
  }
}
final mainController = BehaviorSubject(seedValue: false);

final Stream<bool> output = mainController.map((foo) => !foo);