如何实现 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;
  }

根据您未来的实施,

  1. 您想获取 categories collection 中的所有文档。
  2. 对于 categories collection 中的每个文档,您想要获取 properties subcollection。

对于第一个要求,我们可以简单地流式传输类别 collection。 对于第二个要求,不建议从每个categories subcollection流propertiescollection。这不会很好地扩展到大型数据集。

我们将直播 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.