嵌套的forEach从Firebase检索子集合

时间:2020-05-12 16:41:57

标签: firebase flutter dart google-cloud-firestore

我正在尝试使用嵌套的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;
}

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

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

1 个答案:

答案 0 :(得分:2)

您可以使用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;
  }
}

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

  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

中使用上述功能