flutter - 等待异步 forEach 完成所有迭代,然后在 Dart 中收集数据
问题描述
我需要将 3 个表的数据组合成一个块:
getAll() async {
List<MoveInProgramViewModel> filledList = [];
final moveInProgramList = await moveInProgramRepository.getAllFromDb();
moveInProgramList.forEach((mip) async {
final move = await moveRepository.getFromDb(mip.moveID);
final program = await programRepository.getFromDb(mip.programID);
filledList.add(MoveInProgramViewModel(
mip.id,
move,
program,
mip.indexInProgram,
mip.sets,
mip.createdDate,
mip.modifiedDate,
));
controller.add(filledList);
});
}
请注意,我controller.add(filledList);
在每个循环中都在调用。我更喜欢把它放在循环之外,只有在所有数据都被填充后才被调用,但结果是一个空列表被添加到流中。可能有一个await
或一个阻塞Future
等待循环完成,然后再移动到循环之后的下一条语句。像这个答案所暗示的延迟https://stackoverflow.com/a/62734808/4854670只是一个黑客,而不是一个解决方案。而这个其他答案并没有真正回答这个问题:https ://stackoverflow.com/a/58562342/4854670 。
解决方案
像这样替换您的迭代语句
getAll() async {
List<MoveInProgramViewModel> filledList = [];
final moveInProgramList = await moveInProgramRepository.getAllFromDb();
for (final mip in moveInProgramList) {
final move = await moveRepository.getFromDb(mip.moveID);
final program = await programRepository.getFromDb(mip.programID);
filledList.add(MoveInProgramViewModel(
mip.id,
move,
program,
mip.indexInProgram,
mip.sets,
mip.createdDate,
mip.modifiedDate,
));
controller.add(filledList);
}
}
推荐阅读
- python - Django Rest 框架客户端身份验证
- python-3.x - Python 模块化 - 编写 Python 脚本时,我的 GET / POST / PUT / PATCH 是否应该在不同的模块中
- php - 如何检索您网站的 HOSTNAME
- cannot-find-symbol - 我在尝试回复时不断收到“错误:找不到符号”消息
- kotlin - GSON 为混淆期间受影响的特定字段序列化 null
- python - django提供的开发服务器,./manage.py runserver,更改views.py代码时不再更新
- c# - 当全球化将逗号设置为小数分隔符时,如何在 OpenXML Excel 单元格中存储小数/双精度
- python - 如何在 curl 中给出命令以下载特定时间段?
- docker - ubuntu docker 容器中的无头铬
- python - 列表更新时发出信号