# #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 в один. Есть несколько способов его использования.
- Создайте два метода для своих запросов.
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()); }
- Вы можете позвонить внутри
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); } }); }); }
- Утилизируйте свой поток
@override void dispose() { super.dispose(); roomSubscription?.cancel(); }
Я не проверял свой ответ. Если у вас возникнут какие-либо вопросы, пожалуйста, прокомментируйте их ниже.
Комментарии:
1. Я попытался использовать этот код, который вы предложили, и применил его с помощью StreamBuilder, похоже, он способен извлекать только общую комнату
2. Это должно сработать. Равен ли ваш тип возвращаемого значения?
3. Ну, это интересно, я просто изменил последовательность потока с
[participantStream, publicRoomStream]
на[publicRoomStream, participantStream]
и теперь возвращаю ожидаемый результат, большое вам спасибо, что привели меня сюда