Прогресс загрузки во Flutter - PullRequest
0 голосов
/ 29 мая 2020

Я загружал zip-архив и распаковывал его на устройство, и я могу это сделать, но хочу показать прогресс загрузки

Future<void> _downloadZip(String _zipPath) async {
    Log.e("Zippath",_zipPath);
    var zippedFile = await _downloadFile(_zipPath, _localZipFileName);
    await unarchiveAndSave(zippedFile);
    setState(() {
      _downloading = false;
    });
  }

Файл загрузки

 Future<File> _downloadFile(String url, String fileName) async {
     url="http://115.166.142.178:3000/Zipfile/download/attachment.zip/1";
    var req = await http.Client().get(Uri.parse(url));
    Log.e("DOWNLOAD DIRECTORY",_dir);
    var file = File('$_dir/$fileName');
    return file.writeAsBytes(req.bodyBytes);
  }

Разархивировать и сохранить файл на устройство

unarchiveAndSave(File zippedFile) async {

    var bytes = zippedFile.readAsBytesSync();
    var archive = ZipDecoder().decodeBytes(bytes);
    for (var file in archive) {
      var fileName = '$_dir/${file.name}';

      Log.e('File:: ' ,fileName);
      if (file.isFile) {
        var outFile = File(fileName);
        Log.e('File:: ' ,outFile.path);
        _tempImages.add(outFile.path);
        outFile = await outFile.create(recursive: true);
        await outFile.writeAsBytes(file.content);
      }
    }
  }

Создание каталога

 if (null == _dir) {
      if(Platform.isAndroid){
        _dir = (await getExternalStorageDirectory()).path;
      }else{
        _dir = (await getApplicationDocumentsDirectory()).path;
      }
    }

HTTP-клиент возвращает мне var req = await http.Client().get(Uri.parse(url)); a Future<Response>, поэтому я не могу увидеть прогресс загрузки и попытаться преобразовать в поток, что дает мне ошибку readAsBytesSync was called on null

здесь Ответ @CopsOnRoad работает, но при записи файла с использованием метода unarchiveAndSave дает readAsBytesSync was called on null, потому что readAsBytesSync вызывается на Unit8List, а поток дает List<Int> abd пытается преобразовать в Unit8List, но ничего не работает

с использованием потока

  Future<File> _downloadFile(String url, String fileName) async {
    _response = await http.Client().send(http.Request('GET', Uri.parse(url)));
    _total = _response.contentLength;
    _response.stream.listen((value) {
      setState(() {
        _bytes.addAll(value);
        _received += value.length;
      });
    }).onDone(() async {
      Log.e("DONE","DOWNLOAD");
      Uint8List ubytes = Uint8List.fromList(_bytes);
      var file = File('$_dir/$fileName');

      return file.writeAsBytes(ubytes);

    });
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...