0

我试图sub collection从每个文档ex.clothes,notifer女巫那里获取更多文档,这意味着我不知道它的 ID,我的专横逻辑是获取 maincollection以获取所有documents文档,然后为每个文档获取它sub collection,我用 Future 做到了实现,但我不能使用 Stream 将最终Sub Collection SnapShots ex.properitres列表返回到更改。Future每次都通过它重建,如果我停止小部件重建,AutomaticKeepAliveClientMixin我将无法获得任何Firesotre更改。提前致谢 。在此处输入图像描述

在此处输入图像描述

这是我的未来实现,但我再次需要 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;
  }
4

1 回答 1

1

从您未来的实施来看,

  1. 您想要categories收集所有文档。
  2. 对于categories集合中的每个文档,您想要获取properties子集合。

对于第一个要求,我们可以简单地流式传输类别集合。对于第二个要求,不建议properties从每个categories子集合中流式收集集合。这不适用于大型数据集。

相反,我们将流式传输 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集合。

于 2021-09-15T07:03:32.440 回答