【问题标题】:Nested forEach to retrieve subcollection from Firebase嵌套 forEach 从 Firebase 检索子集合
【发布时间】:2020-08-28 14:46:45
【问题描述】:

我正在尝试使用嵌套的 foreach 检索多个子集合以添加到列表中:

List<Widget> TaskList() {
    List<Widget> lines = [];
    firestoreInstance.collection("tasks").where("type", isEqualTo: "urgent").getDocuments().then((querySnapshot) {
        querySnapshot.documents.forEach((result) {
            firestoreInstance.collection("tasks").document(result.documentID).collection("todo").getDocuments().then((querySnapshot) {
                querySnapshot.documents.forEach((result) {
                    lines.add(Row(
                    children: <Widget> [
                    Expanded(flex: 7, child: Text("test", style: TextStyle(fontSize: 20))), Expanded(flex: 1, child: Text("test", style: TextStyle(fontSize: 20))), Expanded(flex: 2, child: Text("test", style: TextStyle(fontSize: 20), textAlign: TextAlign.right)), ], ));
                });
            });
        });
    });
    return lines;
}

上面的代码可以运行,但是列表是空白的。我想这与等待查询完成有关,因为如果我在不访问 Firebase 的情况下用简单的 for 循环替换 forEach,它就可以工作(添加到列表中的行)。我知道我必须以某种方式使用 Future。但我无法真正弄清楚这种嵌套 foreach 场景的语法。

感谢任何帮助或指向有用示例的指针。

【问题讨论】:

  • 让你方法 async 和 usr futurebuilder 来构建它。

标签: firebase flutter dart google-cloud-firestore


【解决方案1】:

您可以使用asyncawait

  Future<List<Widget>> TaskList() async {
    List<Widget> lines = [];
    QuerySnapshot result = await firestoreInstance
        .collection("tasks")
        .where("type", isEqualTo: "urgent")
        .getDocuments();
    for (var res in result.documents) {
      QuerySnapshot todoResult = await firestoreInstance
          .collection("tasks")
          .document(res.documentID)
          .collection("todo")
          .getDocuments();
      for (var todoRes in todoResult.documents) {
        lines.add(Row(
          children: <Widget>[
            Expanded(
                flex: 7, child: Text("test", style: TextStyle(fontSize: 20))),
            Expanded(
                flex: 1, child: Text("test", style: TextStyle(fontSize: 20))),
            Expanded(
                flex: 2,
                child: Text("test",
                    style: TextStyle(fontSize: 20),
                    textAlign: TextAlign.right)),
          ],
        ));
      }
    }
    return lines;
  }
}

这样,除非两个查询都完成,否则列表不会被填充。如果您要在build 方法中使用此future 方法,请执行以下操作:

  Future<QuerySnapshot> TaskList() async {
    QuerySnapshot todoResult;
    QuerySnapshot result = await firestoreInstance
        .collection("tasks")
        .where("type", isEqualTo: "urgent")
        .getDocuments();
    for (var res in result.documents) {
       todoResult = await firestoreInstance
          .collection("tasks")
          .document(res.documentID)
          .collection("todo")
          .getDocuments();
    }
    return todoResult;
  }

并在FutureBuilder里面使用上面的函数

【讨论】:

  • 非常感谢您的建议。我没有完全遵循,但通过理解你的概念让它发挥作用。我正在使用两个 FutureBuilder(每个都有一个 Future)。第一个 FutureBuilder 在 for 循环中为检索到的结果的每个成员调用 TaskList() 函数。使用收到的 documentID,另一个 FutureBuilder 检索子集合。有点乱,但它有效。努力看看我是否可以进一步简化它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-22
相关资源
最近更新 更多