首页 > 解决方案 > 等待异步 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 。

标签: flutterdartstream-builder

解决方案


像这样替换您的迭代语句

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);
  }
}

推荐阅读