Обновление индикатора выполнения компонента Dart только в конце цикла - PullRequest
0 голосов
/ 22 февраля 2019

Я занимаюсь разработкой приложения в Angular Dart и пытаюсь анимировать индикатор выполнения, который показывает ход загрузки файла.Я просто анализирую JSON из файла и отправляю их в службу с методом _service.create(....).

Я поместил весь этот код в метод async, который вызывается, когда мойНажата кнопка отправки:

void uploadFile() async {

  submitButton.attributes.addAll({ 'disabled': '' });
  progress.value = 0;

  FileList files = input.files;

  if (files.isEmpty) {
    _handleError("No file selected");
    //handle error, probably a banner
    return;
  }

  File file = files.item(0);

  FileReader reader = new FileReader();
  //reader.result
  reader.onLoadEnd.listen((e) async {


    Map map = json.decode(reader.result);

    var combinations = map['combinations'];

    progress.max = combinations.length;

    int loopCount = 0;

    combinations.forEach((e) async {
      await _service.create(VJCombination.fromJSON(e)).then((_) {
        combinationCount++;
        progress.value++;

        loopCount++;

        if (loopCount == combinations.length) {
          submitButton.attributes.remove('disabled');
        }
      });

    });

    isLoadSuccessful = true;

  });

  reader.onError.listen((evt) => print(evt));

  reader.readAsText(file);

  progress.value = 10;

} 

Я получаю элементы progress и submitButton с аннотациями @ViewChild:

@ViewChild('progress')
ProgressElement progress;

@ViewChild('submit')
ButtonElement submitButton;

Код работает.Индикатор выполнения начинается пустым, и после того, как файл прочитан и служба получает данные, индикатор выполнения заполняется.

Моя проблема в том, что пользовательский интерфейс обновляется только после того, как все комбинации были отправлены на _service.Так что, казалось бы, идет от пустого до полного в одном кадре.

1 Ответ

0 голосов
/ 22 февраля 2019

Этот код

 combinations.forEach((e) async {

не имеет смысла, поскольку forEach не заботится о возвращенном Future

Скорее использовать

 for(var e in combinations) {

Неконечно, если это решит вашу проблему, но такой код определенно необходимо изменить.

...