Вы определили обратный вызов для forEach как async
, что означает, что он выполняется асинхронно.Другими словами: код внутри этого обратного вызова выполняется независимо от кода вне обратного вызова.Именно поэтому print("test");
запускается перед кодом внутри обратного вызова.
Самое простое решение - переместить весь код, которому требуется информация из обратного вызова , в обратный вызов.Но также может быть способ ожидать всех асинхронных обратных вызовов , аналогично тому, как вы уже await
once
вызываете над ним.
Обновление Я получил работу, что я думаю, что вы хотите сделать.С помощью этого JSON:
{
"data" : {
"key1" : {
"created" : "20181221T072221",
"name" : "I am key1"
},
"key2" : {
"created" : "20181221T072258",
"name" : "I am key 2"
},
"key3" : {
"created" : "20181221T072310",
"name" : "I am key 3"
}
},
"index" : {
"key1" : true,
"key3" : true
}
}
я могу прочитать индекс, а затем объединить данные с помощью:
final ref = FirebaseDatabase.instance.reference().child("/53886373");
final index = await ref.child("index").once();
List<Future<DataSnapshot>> futures = [];
index.value.entries.forEach((json) async {
print(json);
futures.add(ref.child("data").child(json.key).once());
});
Future.wait(futures).then((List<DataSnapshot> responses) {
responses.forEach((snapshot) {
print(snapshot.value["name"]);
});
});