在Flutter中比较两个不同的Firebase集合的两个不同的流,并返回同时存在于两者中的文档,可以按照以下步骤进行:
import 'package:cloud_firestore/cloud_firestore.dart';
where
方法来筛选出同时存在于两个集合中的文档:Stream<List<DocumentSnapshot>> getCommonDocuments() {
CollectionReference collection1 = FirebaseFirestore.instance.collection('collection1');
CollectionReference collection2 = FirebaseFirestore.instance.collection('collection2');
Stream<QuerySnapshot> stream1 = collection1.snapshots();
Stream<QuerySnapshot> stream2 = collection2.snapshots();
return stream1.asyncMap((snapshot1) {
return Future.wait(snapshot1.docs.map((doc1) {
return collection2.doc(doc1.id).get().then((doc2) {
if (doc2.exists) {
return doc1;
} else {
return null;
}
});
}).toList());
}).map((docs) => docs.where((doc) => doc != null).toList());
}
在上述代码中,我们首先获取两个集合的流stream1
和stream2
,然后使用asyncMap
方法将第一个流中的每个文档与第二个集合进行比较。如果第二个集合中存在相同的文档,则返回该文档,否则返回null
。最后,使用map
方法过滤掉为null
的文档,并返回结果流。
StreamBuilder
来监听流的变化,并更新UI:StreamBuilder<List<DocumentSnapshot>>(
stream: getCommonDocuments(),
builder: (context, snapshot) {
if (snapshot.hasData) {
List<DocumentSnapshot> documents = snapshot.data;
// 在这里处理文档数据
return ListView.builder(
itemCount: documents.length,
itemBuilder: (context, index) {
DocumentSnapshot document = documents[index];
return ListTile(
title: Text(document['title']),
subtitle: Text(document['description']),
);
},
);
} else if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
} else {
return CircularProgressIndicator();
}
},
);
在上述代码中,我们使用StreamBuilder
来监听getCommonDocuments()
方法返回的流。当流中有数据时,我们可以处理文档数据并更新UI。如果出现错误,我们显示错误信息。如果流中没有数据,我们显示一个进度指示器。
通过以上步骤,你可以比较两个不同的Firebase集合的两个不同的流,并在Flutter中返回同时存在于两者中的文档。请注意,这里的示例代码仅供参考,你需要根据自己的实际需求进行适当的修改和调整。
领取专属 10元无门槛券
手把手带您无忧上云