如何实现 Stream 以获取每个文档的子集合列表? -扑
Posted
技术标签:
【中文标题】如何实现 Stream 以获取每个文档的子集合列表? -扑【英文标题】:How can I implement Stream to get list of sub collection for each docs ? -flutter 【发布时间】:2021-11-10 03:15:15 【问题描述】:我试图从每个文档 ex.clothes,notifer
中获取 sub collection
女巫我有更多文档,这意味着我不知道它的 ID,我的专横逻辑是获取主要的 collection
以获取所有 @ 987654328@ 然后为每个文档获取它的sub collection
,我通过 Future 实现做到了这一点,但我不能使用 Stream 返回最终的 Sub Collection SnapShots
ex.properitres
以列出更改。 Future
它每次都重建,如果我停止通过 AutomaticKeepAliveClientMixin
重建小部件,我无法得到任何 Firesotre
更改。提前致谢。
这是我的 Future 实现,但我再次需要 Stream ^_^ 的实现:
Future<List<Category>> getPropertiesDocs() async
List<QueryDocumentSnapshot> _firstListOfDocs = [];
List<Category> _categorListOfDocs = [];
List<QueryDocumentSnapshot> _secoudListOfDocs = [];
final QuerySnapshot result = await _firebaseFirestore.collection('categories').get();
result.docs.forEach((element)
// print(element.id);
_firstListOfDocs.add(element);
);
for (var i in _firstListOfDocs)
final QuerySnapshot snapshot2 = await i.reference.collection("properties").get();
snapshot2.docs.forEach((element)
_secoudListOfDocs.add(element);
_categorListOfDocs.add(Category.fromSnapShpt(element));
);
_firstListOfDocs.clear();
_secoudListOfDocs.clear();
return _categorListOfDocs;
【问题讨论】:
【参考方案1】:从您未来的实施来看,
-
您想获取
categories
集合中的所有文档。
对于categories
集合中的每个文档,您都希望获得properties
子集合。
对于第一个要求,我们可以简单地流式传输类别集合。
对于第二个要求,不建议从每个 categories
子集合流式传输 properties
集合。这不适用于大型数据集。
相反,我们将流式传输 collectionGroup properties
。流式传输集合组 properties
将获取名称为 properties
的所有集合(无论位置如何)。为了有效地使用它,不应将其他集合命名为 properties
(您要获取的集合除外),或者将您的集合重命名为 properties_categories
之类的不同名称。
// this streamBuilder will fetch stream for categories collection.
StreamBuilder<QuerySnapshot>(
stream: _firebaseFirestore.collection('categories').snapshots(),
builder: (BuildContext context,
AsyncSnapshot<QuerySnapshot<Delivery>> snapshot)
if (snapshot.hasError) return Message();
if (snapshot.connectionState == ConnectionState.waiting)
return Loading();
print('categories snapshot result');
print(snapshot.data.docs.map((e) => e.data()).toList());
// _firstListOfDocs is given below (renamed to _categoryDocs)
List<QueryDocumentSnapshot> _categoryDocs = snapshot.data.docs;
// this streamBuilder will fetch all documents in all collections called properties.
return StreamBuilder<QuerySnapshot>(
stream: _firebaseFirestore.collectionGroup('properties').snapshots(),
builder: (BuildContext context,
AsyncSnapshot<QuerySnapshot> propertiesSnapshot)
if (propertiesSnapshot.hasError) return Message();
if (propertiesSnapshot.connectionState == ConnectionState.waiting)
return Loading();
print('properties snapshot result');
print(propertiesSnapshot.data.docs.map((e) => e.data()).toList());
// _secoudListOfDocs is given below (and renamed to _propertiesDocs)
List<QueryDocumentSnapshot> _propertiesDocs = propertiesSnapshot.data.docs;
// _categorListOfDocs is given below (and renamed to _categories)
List<Category> _categories = propertiesSnapshot.data.docs
.map((e) => Category.fromSnapShpt(e)).toList();
// return your widgets here.
return Text('Done');
,
);
,
)
如果您获取categories
集合数据的原因只是简单地循环它并获取properties
集合,那么您可以删除上面的第一个streamBuilder,因为我们不需要使用它来获取properties
集合。
【讨论】:
以上是关于如何实现 Stream 以获取每个文档的子集合列表? -扑的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Flutter 中嵌套 StreamBuilder?
如何在 Firestore 中获取生成的文档 ID,然后将子集合添加到其中?