我正在嘗試使用條件過濾我的資料 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 中實作這個查詢?
uj5u.com熱心網友回復:
您必須將兩個 API 合二為一。有幾種方法可以使用它。
- 為您的查詢創建兩種方法。
Stream<List<RoomModel>> stream1(String userUid) {
var ref = FirebaseFirestore.instance
.collection('rooms')
.where('participants', arrayContains: userUid);
return ref
.snapshots()
.map((list) => list.docs.map((doc) => RoomModel.fromForestore(doc)).toList());
}
Stream<List<RoomModel>> stream2() {
var ref = FirebaseFirestore.instance
.collection('rooms')
.where('private', isEqualTo: false);
return ref
.snapshots()
.map((list) => list.docs.map((doc) => RoomModel.fromForestore(doc)).toList());
}
- 您可以在內部呼叫
initState或使用StreamBuilder小部件。我用了initState
List<RoomModel> 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) => e.docId == element.docId);
allRooms.add(element);
}
});
});
}
- 處置您的流
@override
void dispose() {
super.dispose();
roomSubscription?.cancel();
}
我沒有測驗我的答案。如果您遇到任何問題,請在下方評論。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/369066.html
標籤:扑 镖 谷歌云firestore
