我的目标是使用多个流,而不必嵌套3+ StreamBuilders。
我已经在使用rxdart而且我考虑过合并,但我真的不明白使用它的正确语法?
我目前有一个标题为qazxsw poi的块文件。这是qazxsw poi里面的代码
InfoBloc
现在在窗口小部件内部,我需要名称,图片和描述快照。所以我通常会这样做
InfoBloc
但必须有一个更好的方法来做到这一点。
我的梦想是我可以在 final _name = BehaviorSubject<String>();
final _description = BehaviorSubject<String>();
final _picture = BehaviorSubject<File>();
Observable<String> get name => _name.stream.transform(_validateName);
Observable<File> get picture => _picture.stream;
Observable<String> get eventDescription =>
_description.stream.transform(_validateMessage);
final _validateMessage = StreamTransformer<String, String>.fromHandlers(
handleData: (eventMessage, sink) {
if (eventMessage.length > 0) {
sink.add(eventMessage);
} else {
sink.addError(StringConstant.eventValidateMessage);
}
});
var obs = Observable.merge([])
final _validateName = StreamTransformer<String, String>.fromHandlers(
handleData: (String name, sink) {
if (RegExp(r'[!@#<>?":_`~;[\]\\|=+)(*&^%0-9-]').hasMatch(name)) {
sink.addError(StringConstant.nameValidateMessage);
} else {
sink.add(name);
}
});
void dispose() async {
await _description.drain();
_description.close();
await _name.drain();
_name.close();
await _picture.drain();
_picture.close();
}
文件中创建一些可以组合所有这些流的东西,我只需要使用StreamBuilder一次来传输组合流。
您可以查看 StreamBuilder(
stream: _bloc.name,
builder: (BuildContext context, AsyncSnapshot<String> snapshotName) {
return StreamBuilder(
stream: _bloc.eventDescription,
builder: (BuildContext context, AsyncSnapshot<String> snapshotDescription) {
return StreamBuilder(
stream: _bloc.picture,
builder: (BuildContext context, AsyncSnapshot<File> snapshotName) {
类的InfoBloc
方法。它通过使用组合器函数将给定的Streams合并为一个Observable序列,这样生成的Observable将不会发出,除非所有Streams都发出了至少一个项目。
有一堆combineLatest()
方法。但由于你有3个Streams,你可以使用Observable
。
示例 -
combineLatest()
您可以查看combineLatest3()
链接以获取更多信息。
更新 -
您可以参考以下示例在代码中使用该函数。
Observable.combineLatest3(
new Observable.just("a"),
new Observable.just("b"),
new Observable.fromIterable(["c", "c"]),
(a, b, c) => a + b + c)
.listen(print); //prints "abc", "abc"
例如,我使用了this型Observable<String> get name => _name.stream.transform(_validateName);
Observable<File> get picture => _picture.stream;
Observable<String> get eventDescription => _description.stream.transform(_validateMessage);
//Add this line to combine your Streams
Observable<bool> readyToSubmit => Observable.combineLatest3(name, picture, eventdescription, (value1, value2, value3) => true);
//We simply return true from the combiner function since we don't want to perform any operation on the Streams when combining.
。您可以将类型更改为可以使用的bool
MapObservable
StreamBuilder`小部件 -
Map<String, dynamic>' and add the Stream values into the
希望这可以帮助!