将多个BehaviorSubject流合并为一个?

问题描述 投票:1回答:1

我的目标是使用多个流,而不必嵌套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一次来传输组合流。

dart rxdart
1个回答
1
投票

您可以查看 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"

例如,我使用了thisObservable<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. 。您可以将类型更改为可以使用的boolMapObservableStreamBuilder`小部件 -

Map<String, dynamic>' and add the Stream values into the

希望这可以帮助!

© www.soinside.com 2019 - 2024. All rights reserved.