我正在尝试使用嵌套的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方案的语法。
感谢任何帮助或指向有用示例的指针。
答案 0 :(得分:2)
您可以使用async
和await
:
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