将流与rxdart合并以在单个StreamBuilder中使用

时间:2019-11-01 23:52:29

标签: flutter dart google-cloud-firestore

几天来,我一直在寻找这个问题的答案。 许多示例对我来说都很令人困惑,尽管它们看起来很简单,但我真的不理解如何使用rxdart来实现它们。

我正在尝试将Firestore中的4个集合组合在一起,以在单个StreamBuilder中使用。

Observable<QuerySnapshot> firstList = Firestore.instance.collection(bla).snapshots();

Observable<QuerySnapshot> secondList = Firestore.instance.collection(blabla).snapshots();

Observable<QuerySnapshot> thirdList= Firestore.instance.collection(blablabla).snapshots();

Observable<QuerySnapshot> fourthList= Firestore.instance.collection(blablablabla).snapshots();

最新编辑 我已经像尝试使用rxdart之前那样从Observable更改为Stream。

Stream<QuerySnapshot> firstList = Firestore.instance.collection(bla).snapshots();

Stream<QuerySnapshot> secondList = Firestore.instance.collection(blabla).snapshots();

Stream<QuerySnapshot> thirdList= Firestore.instance.collection(blablabla).snapshots();

Stream<QuerySnapshot> fourthList= Firestore.instance.collection(blablablabla).snapshots();

我正在使用rxdart将它们结合起来:

Observable<SomeList> allList = Observable.combineLatest4(
        firstList,
        secondList,
        thirdList,
        fourthList, (a, b, c, d) => SomeList(a, b, c, d));

这是我上面使用的课程:

class SomeList{
  QuerySnapshot firstList;
  QuerySnapshot secondList;
  QuerySnapshot thirdList;
  QuerySnapshot fourthList;

  SomeList(this.firstList, this.secondList, this.thirdList,
      this.fourthList);
}

在构建方法中,我将返回一个StreamBuilder,如下所示:

Widget build(BuildContext context) {
    return Scaffold(
        appBar: _bla(),
        body: SingleChildScrollView(
        child: Column(
            children: <Widget>[
                return new StreamBuilder(
                    stream: allList, // here is my main issue
                    ...
                    ),
                ]
            ),
        ),  
    );
}   

运行代码时出现异常:

Class 'SomeList' has no instance getter 'documents'.
Receiver: Instance of 'SomeList'
Tried calling: documents
type '_BroadcastStream<QuerySnapshot>' is not a subtype of type 'Observable<QuerySnapshot>'
所以我尝试在初始化allList时删除对asBroadcastStream()的调用,但是错误是相同的。

发布问题之前,我已经研究了以下示例:
Update streams based on filters in Dart/Flutter
Merge Firestore streams using rxDart
https://www.burkharts.net/apps/blog/rxdart-magical-transformations-of-streams/
https://medium.com/@ayushpguptaapg/using-streams-in-flutter-62fed41662e4

将这些流合并为一个流,然后在StreamBuilder中使用的正确方法是什么? 您能举个小例子吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

snapshots()返回简单的dart异步 Stream ,而不是rxdart的 Observable 。您可以通过包装将它创建为Observable:

Observable<QuerySnapshot> firstList = Observable(Firestore.instance.collection(bla).snapshots());

UPD:Observable扩展了Stream类,它可以像任何常规Stream一样使用。 RxDart没有引入新的API(与任何其他语言的实现不同)。相反,它使用的是dart的默认异步库,该库已经具有StreamStreamController之类的类。 Observable 类仅扩展了 Stream 类,因此您可以使用Observable实例代替默认的dart Stream(例如在StreamBuilder中)。 RxDart的Observable也可以使用默认流。

您遇到的另一个错误是因为您试图从SomeList实例访问“文档”字段,但是您的类没有这样的字段。