Запрос коллекции Firestore с оператором ИЛИ с помощью Flutter

# #flutter #dart #google-cloud-firestore

#трепетать #дротик #google-облако-firestore

Вопрос:

Я пытаюсь отфильтровать свои данные с учетом условий you are participant or the room is public

 // get list of rooms contains your Uid var participantSnapshot = _roomCollection.where('participants', arrayContains: 'userUid'); // get list of public room var publicRoomSnapshot = _roomCollection.where('private', isEqualTo: false);  

Как я могу реализовать этот запрос в Flutter/Dart?

Комментарии:

1. Это потоковый вызов или будущий вызов?

2. Это потоковый вызов

Ответ №1:

Вы должны объединить два ваших API в один. Есть несколько способов его использования.

  1. Создайте два метода для своих запросов.
 Streamlt;Listlt;RoomModelgt;gt; stream1(String userUid) {  var ref = FirebaseFirestore.instance  .collection('rooms')  .where('participants', arrayContains: userUid);    return ref  .snapshots()  .map((list) =gt; list.docs.map((doc) =gt; RoomModel.fromForestore(doc)).toList());  }    Streamlt;Listlt;RoomModelgt;gt; stream2() {  var ref = FirebaseFirestore.instance  .collection('rooms')  .where('private', isEqualTo: false);    return ref  .snapshots()  .map((list) =gt; list.docs.map((doc) =gt; RoomModel.fromForestore(doc)).toList());  }  
  1. Вы можете позвонить внутри initState или с помощью StreamBuilder виджета. Я использовал initState
  Listlt;RoomModelgt; allRooms = []; StreamSubscription roomSubscription;   @override  void initState() {  super.initState();  var s4 = StreamGroup.merge([stream1(uid), stream2()]).asBroadcastStream();  roomSubscription = s4.listen((event) {  event.forEach((element) {  if (element is RoomModel) {  allRooms.removeWhere((e) =gt; e.docId == element.docId);  allRooms.add(element);  }  });  });  }  
  1. Утилизируйте свой поток
 @override  void dispose() {  super.dispose();  roomSubscription?.cancel();  }  

Я не проверял свой ответ. Если у вас возникнут какие-либо вопросы, пожалуйста, прокомментируйте их ниже.

Комментарии:

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

2. Это должно сработать. Равен ли ваш тип возвращаемого значения?

3. Ну, это интересно, я просто изменил последовательность потока с [participantStream, publicRoomStream] на [publicRoomStream, participantStream] и теперь возвращаю ожидаемый результат, большое вам спасибо, что привели меня сюда