Объедините потоки с rxdart для использования в одном StreamBuilder - PullRequest
0 голосов
/ 02 ноября 2019

В течение нескольких дней я пытался найти ответ на этот вопрос. Многие примеры сбивают меня с толку, и я действительно не понимаю, как их реализовать с помощью rxdart, несмотря на то, что они выглядят очень просто.

Я пытаюсь объединить 4 коллекции из Firestore для использования в одном 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();

ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ Я изменил с Observable на Stream, как это было до того, как я попытался использовать rxdart.

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>'
Поэтому я попытался удалить вызов asBroadcastStream () при инициализации allList, ноошибка такая же.

Я посмотрел эти примеры перед тем, как опубликовать мою проблему:
Обновление потоков на основе фильтров в Dart / Flutter
Объединение потоков Firestore с использованием rxDart
https://www.burkharts.net/apps/blog/rxdart-magical-transformations-of-streams/
https://medium.com/@ayushpguptaapg/using-streams-in-flutter-62fed41662e4

Как правильно объединить эти потоки в один поток, а затем использовать в StreamBuilder? Не могли бы вы привести небольшой пример?

Спасибо!

1 Ответ

0 голосов
/ 02 ноября 2019

snapshots () возвращает простой асинхронный дротик Stream , а не rxdart Observable . Вы можете создать Observable из него, просто обернув его:

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

UPD: Observable расширяет класс Stream, и его можно использовать как любой обычный поток. RxDart не представляет новый API (в отличие от реализаций любого другого языка). Вместо этого он использует асинхронную библиотеку dart по умолчанию, которая уже имеет классы, такие как Stream и StreamController . Observable класс просто расширяет Stream класс, так что вы можете использовать экземпляр Observable вместо стандартного Stream dart (например, в StreamBuilder). Observable от RxDart может работать и с потоками по умолчанию.

Другая ошибка, которую вы получаете, связана с тем, что вы пытаетесь получить доступ к полю «документы» из экземпляра SomeList, но у вашего класса, у которого такого поля нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...