如何实现 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,然后将子集合添加到其中?

如何从 Firestore 获取子集合数据

StreamBuilder ListView 在首次加载时从 Firestore 返回空列表

有没有办法获取子集合中的所有文档(Firestore)

如何以正确的方式访问我的子集合?