Firestore объединяет 2 запроса с Flutter - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь сделать 2 запроса к Firestore и объединить результаты в один для имитации запроса Firestore OR.

Я сегментировал свой код в соответствии с шаблоном блока.

///private method to zip QuerySnapshot streams
Stream<List<QuerySnapshot>> _combineStreams(String userId) {

    var stream1 = todosCollection
        .where("owners", arrayContains: userId)
        .snapshots();

    var stream2 = todosCollection
      .where("contributors", arrayContains: userId)
      .snapshots();

    return StreamZip(([stream1, stream2])).asBroadcastStream();
  }

///exposed method to be consumed by repository
Stream<List<Todo>> todos(String userId) {

    var controller = StreamController<List<Todo>>();

    _combineStreams(userId).listen((snapshots) {

      List<DocumentSnapshot> documents = List<DocumentSnapshot>();

      snapshots.forEach((snapshot) {
        documents.addAll(snapshot.documents);
      });

      final todos = documents.map((doc) {
        return Todo.fromEntity(TodoEntity.fromSnapshot(doc));
      }).toList();

      controller.add(todos);
    });

    return controller.stream;
  }

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

_gardensSubscription?.cancel();
    _gardensSubscription = _dataRepository.gardens(event.userId).listen(
          (gardens) {
        dispatch(
          GardensUpdated(gardens),
        );
      },
    );

Я не очень доволен Stream и особенно процессом StreamController.Можно ли выполнить эту задачу проще?

1 Ответ

0 голосов
/ 27 сентября 2019

Время использовать великие возможности RxDart: https://pub.dev/packages/rxdart

Вы не можете выполнять все типы преобразований потоков с этой библиотекой.

Например, вы можете использовать операторы слияниядостичь именно того, что вы хотите

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