如何实现 Stream 以获取每个文档的子集合列表? -扑
How can I implement Stream to get list of sub collection for each docs ? -flutter
我尝试从每个文档中获取 sub collection
ex.clothes,notifer
我有更多文档,这意味着我不知道它的 ID,我的霸道逻辑是获取获取所有 documents
的主要 collection
,然后为每个文档获取其 sub collection
,我通过 Future 实现做到了这一点,但我无法使用 Stream to return 最终 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;
}
根据您未来的实施,
- 您想获取
categories
collection 中的所有文档。
- 对于
categories
collection 中的每个文档,您想要获取 properties
subcollection。
对于第一个要求,我们可以简单地流式传输类别 collection。
对于第二个要求,不建议从每个categories
subcollection流properties
collection。这不会很好地扩展到大型数据集。
我们将直播 collection 组 properties
。流式传输 collection 组 properties
将获取名称为 properties
的所有 collection(无论位置如何)。为了有效地使用它,不应将其他 collection 命名为 properties
(除了您要获取的那些),或者您将 collection 重命名为 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
collection 数据的原因只是循环并获取 properties
collection,那么您可以删除上面的第一个 streamBuilder,因为我们不需要用它来获取 properties
collection.
我尝试从每个文档中获取 sub collection
ex.clothes,notifer
我有更多文档,这意味着我不知道它的 ID,我的霸道逻辑是获取获取所有 documents
的主要 collection
,然后为每个文档获取其 sub collection
,我通过 Future 实现做到了这一点,但我无法使用 Stream to return 最终 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;
}
根据您未来的实施,
- 您想获取
categories
collection 中的所有文档。 - 对于
categories
collection 中的每个文档,您想要获取properties
subcollection。
对于第一个要求,我们可以简单地流式传输类别 collection。
对于第二个要求,不建议从每个categories
subcollection流properties
collection。这不会很好地扩展到大型数据集。
我们将直播 collection 组 properties
。流式传输 collection 组 properties
将获取名称为 properties
的所有 collection(无论位置如何)。为了有效地使用它,不应将其他 collection 命名为 properties
(除了您要获取的那些),或者您将 collection 重命名为 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
collection 数据的原因只是循环并获取 properties
collection,那么您可以删除上面的第一个 streamBuilder,因为我们不需要用它来获取 properties
collection.