希望我能说清楚。
在观看视频和教程之后,我发现这种方式使一些小部件可以将数据输入到块(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)
首先,我要说的是,您可以使用自定义工厂构造函数删除私有变量。这是一个例子:
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 无需进行任何更改。
这是没有必要的。但推荐。
| 归档时间: |
|
| 查看次数: |
1231 次 |
| 最近记录: |