对于一个实例,让我们假设我正在initState中调用一个函数,该函数从Firebase集合中获取一些文档。我正在使用async forEach迭代这些文档,并且需要执行await操作,以从firebase的另一个集合中获取一些数据,并将它们保存在列表中,然后在forEach完成后返回。但是,由于return语句之后的第二个await函数完成时,返回的列表为空。我该如何处理?我很难理解异步编程,因此请高度赞赏详细的解释。
这里的代码只是显示实际情况的示例代码。
Future getList() async {
//These are just example refs and in the actual refs it does print actual values
var collectionOneRef = Firestore.instance.collection('Collection1');
var collectionTwoRef = Firestore.instance.collection('Collection2');
List<Map<String, dynamic>> properties = [];
QuerySnapshot querySnapshot = await collectionOneRef
.getDocuments()
.then((query) {
query.documents.forEach((colOneDoc) async {
var colOneID = colOneDoc.documentID;
await collectionTwoRef.document(colOneID).get().then((colTwoDoc) {
Map<String, dynamic> someMap = {
"field1": colTwoDoc['field1'],
"field2": colTwoDoc['field2']
};
properties.add(someMap);
properties.sort((p1, p2) {
//sorting based on two properties
var r = p1["field1"].compareTo(p2["field1"]);
if (r != 0) return r;
return p1["field2"].compareTo(p2["field2"]);
});
print(properties); //this prints actual data in it
));
});
});
});
print(properties); //This prints a blank list as [] and obviously returns blank list
return properties;
}
现在,当我在有状态Widget的initState中调用此函数并将其显示在某处时,它将显示一个空白列表。但是,在“热重载”之后,它将显示。我想获取数据并显示它而不进行热重载。预先感谢
答案 0 :(得分:0)
听起来像您需要在调用getList()
的代码块中等待整个函数本身。
您正在函数内部进行同步和等待,这看起来不错,这就是为什么在热重载时获得结果的原因。但是可能是这样的情况,您实际上并没有在调用此代码的代码中等待整个函数本身。请检查。