我的代码( TextEdittingController )上有一些值通知器,我想将它们转换为流,因此我可以使用rx_dart
的Observable.combineLatest检查是否所有它们在我的代码中一次为空,返回检查结果( bool )并将其仅嵌入到一个StreamBuilder
中。
类似的东西:
StreamBuilder<bool>(
stream: Observe.combineLatest2(STREAM1, STREAM2, (s1,s2) => s1.text.isNotEmpty && s2.text.isNotEmpty),
builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
if (snapshot.data == true) {
return ShowUp.fifth(
child: Padding(
padding: const EdgeInsets.all(16),
child: RaisedButton(
shape: StadiumBorder(),
child: Text("Finish"),
onPressed: _finishPressed,
),
),
);
} else {
return Container();
}
},
)
如何将ValueNotifier转换为流?
答案 0 :(得分:0)
我提供的解决方案就是那种解决方案,但我不知道这是否是正确的方法。我会在这里分享,但我希望有人有更好的目标:
记住:使用后必须调用它的关闭方法,否则它将泄漏。
class ValueNotifierStream<T> extends Stream<T> {
final ValueNotifier _valueNotifier;
final _subject = BehaviorSubject<T>();
VoidCallback _notifierCallback;
ValueNotifierStream(this._valueNotifier) {
_subject.add(_valueNotifier.value);
_notifierCallback = () {
_subject.add(_valueNotifier.value);
};
_valueNotifier.addListener(_notifierCallback);
}
@override
StreamSubscription<T> listen(
void Function(T event) onData, {
Function onError,
void Function() onDone,
bool cancelOnError,
}) {
return _subject.listen(
onData,
onError: onError,
onDone: onDone,
cancelOnError: cancelOnError,
);
}
void close() {
_valueNotifier.removeListener(_notifierCallback);
_subject.close();
}
}