如何将列表返回给StreamBuilder?

时间:2019-11-16 16:45:44

标签: firebase flutter dart

我知道我在这里问的很多,但是没有人给我正确的答案。

我只需要返回一个列表,其中包含Firebase子集合中的值。

这是我的代码:

  List mapToList({DocumentSnapshot doc, List<DocumentSnapshot> docList}) {
    if (docList != null) {
      List<Store> storeList = [];
      docList.forEach((document) async {
        String productName;
        String name = document.data[StringConstant.nameField];

        QuerySnapshot productRef = await document.reference.collection('products').getDocuments();
        productRef.documents.forEach((value){
          productName = value["name"];
        });

          Store otherStore = Store(name, productName);
          storeList.add(otherStore);

      });
      print(storeList.length);
      return storeList;
    } else {
      return null;
    }
  }

或者我想要这样的东西:

List mapToList({DocumentSnapshot doc, List<DocumentSnapshot> docList}) {
    if (docList != null) {
      List<Store> storeList = [];
      docList.forEach((document) async {
        //I KNOW THIS IS WRONG, BUT I NEED SOMETHING LIKE THE LINE BELOW
        String productName = document.data.reference.collection("products").data["productName];

        String name = document.data["name];
          Store otherStore = Store(name, productName);
          storeList.add(otherStore);
      });
      return storeList;
    } else {
      return null;
    }
  }

如何获取此列表?

1 个答案:

答案 0 :(得分:1)

子集合没有“字段”,您可以按照希望的方式直接访问这些“字段”。如The Cloud Firestore Data Model中所述,集合和子集合实际上都只是一组文档的名称。您不能直接访问子集合中的字段,必须先引用该子集合中的文档,然后再引用该文档的字段。文档是唯一包含字段的东西。

针对您的情况,我建议您仅在此处考虑的每个文档的product字段中存储一张地图。或者,如果您绝对必须使用子集合(可能是为将来的模式更改保留灵活性的一种方式),请使用document.collection('products').document('productName')["value"]或类似的东西。

子集合的工作方式是这样的,因为它们确实提供了一种存储仅与特定文档相关的数据的方法,因此该文档的安全设置也固有地应用于子集合。就像链接中的示例一样,rooms是聊天室的集合,每个聊天室都是带有名称和对messages子集合的引用的文档,每个子集合都包含消息及其作者。如果没有messages文档,则room子集合会失去上下文。

相关问题