Ожидание async 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.


person mrahimygk    schedule 17.01.2021    source источник


Ответы (1)


Замените оператор итерации следующим образом

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);
  }
}
person dm_tr    schedule 17.01.2021
comment
Использование простого for цикла позволяет нам controller.add(filledList); выйти из цикла, и он работает, как задумано. - person mrahimygk; 18.01.2021