希望我能澄清自己。
在观看视频和教程之后,我发现这种方式使一些小部件可以将数据输入到块(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();
}
}
答案 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();
});
}
}