Прогресс загрузки в дартс: http - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь сделать индикатор выполнения для загружаемого файла, но если я добавляю слушателя к StreamedResponse, конвейер работает, но не завершает свое будущее.

final client = new http.Client();
http.StreamedResponse response = await client.send(http.Request("GET", Uri.parse('someurl')));

var received = 0;
var length = response.contentLength;

//if I remove this listener, the await below gets completed
var listen = response.stream.listen((List<int> bytes) {
  received += bytes.length;
  print("${(received / length) * 100} %");
});

var sink = downloadFile.openWrite();
await response.stream.pipe(sink);
listen.cancel();
sink.close();

На github они уже сообщили кому-то, что он должен работать, но на Документах StreamedResponse остается, что This should always be a single-subscription stream..Таким образом, добавление слушателя для вычисления процента, похоже, приводит к ошибкам в StreamedResponse трубе.Есть идеи, как заставить это работать?

1 Ответ

0 голосов
/ 18 июня 2019

@ pskink comment Позвольте мне перейти к этому решению, которое работает для каждого типа sink, который вы используете.

  var length = response.contentLength;
  var received = 0;
  var sink = downloadFile.openWrite();

  await response.stream.map((s) {
    received += s.length;
    print("${(received / length) * 100} %");
    return s;
  }).pipe(sink);

Еще один способ сделать это, если вы пишете в файл, - посмотреть длину файла

  var length = response.contentLength;
  var sink = downloadFile.openWrite();

  Future.doWhile(() async {
    var received = await downloadFile.length();

    print("${(received / length) * 100} %");
    return received != length;
  });

  await response.stream.pipe(sink);
...