在 for 循环中等待查询 - Flutter Firebase

Wait for query inside for loop - Flutter Firebase

我有这个功能可以根据用户的 ID 创建用户列表。对每个 id 进行查询以从 Firebase RTDB 获取信息。

static List<FrediUser> formattedParticipantListFromIDs(List<String> participantIDs) {
List<FrediUser> formattedParticipants = [];

for (String id in participantIDs) {
  dbQuery(2, 'users', id).once().then((value) {
    formattedParticipants.add(FrediUser.fromMap(value.snapshot.value as Map));
  });
}

print(formattedParticipants.length);
Future.delayed(const Duration(seconds: 3), () {
  print(formattedParticipants.length);
});

return formattedParticipants;  }

第一个打印语句的输出

0

第二个打印语句的输出

3


问题

return 始终是一个空列表。如您所见,循环和 return 语句不等待列表被填充。但是,如果您等待 3 秒,列表确实会填充,但为时已晚。

如何在 for 循环的每次迭代中等待查询完成以及 .then 被调用和完成?

*此方法在class的工厂构造函数中调用,因此不能使用futures和awaits。

您需要使用 await 来等待异步 once() 方法。

//      
static Future<List<FrediUser>> formattedParticipantListFromIDs(List<String> participantIDs) 
async {
//    
  List<FrediUser> formattedParticipants = [];

  for (String id in participantIDs) {
              // 
    var value = await dbQuery(2, 'users', id).once();
    formattedParticipants.add(FrediUser.fromMap(value.snapshot.value as Map));
  }

  print(formattedParticipants.length);

  return formattedParticipants;  
}

如您所见,这意味着您的 formattedParticipantListFromIDs 函数必须标记为 async,并且 returns 和 Future。没有办法阻止这种情况,因为没有办法使异步代码同步运行。

有关这方面的更多信息,我建议参加 Asynchronous programming: futures, async, await

上的 Dart 代码实验室