download method

Future download({
  1. required String url,
  2. required String savePath,
  3. bool isExternalUrl = false,
  4. required dynamic onSuccess(
    1. String
    ),
  5. dynamic onError(
    1. ErrorEntity
    )?,
  6. dynamic onProgress(
    1. int
    )?,
  7. dynamic onStart()?,
  8. dynamic onFinish()?,
})

下载文件 url下载地址 当isExternalUrl为true,传完整下载路径;isExternalUrl为false,传相对路径 savePath存储路径 isExternalUrl 是否为外部地址(默认false); onSuccess请求成功回调 onError请求失败回调 onProgress请求过程回调(百分比 0~100) onStart发起请求前回调 onFinish请求完成回调(不论请求失败与否)

Implementation

Future download({
  required String url,
  required String savePath,
  bool isExternalUrl = false,
  required Function(String) onSuccess,
  Function(ErrorEntity)? onError,
  Function(int)? onProgress,
  Function()? onStart,
  Function()? onFinish,
}) async {
  String downloadUrl = "";
  if (isExternalUrl) {
    downloadUrl = url;
  } else {
    String host = DomainManager().getDomain(DomainType.fileDownload);
    downloadUrl = host + url;
  }
  onStart?.call();
  try {
    _logDownload("下载路径 $savePath");
    await _dio!.download(downloadUrl, savePath,
        // disable gzip
        options: Options(
          headers: {HttpHeaders.acceptEncodingHeader: "*"},
          receiveTimeout: defHttpTimeoutLong,
          sendTimeout: defHttpTimeoutLong,
        ), onReceiveProgress: (received, total) {
      if (total != -1) {
        int percent = received * 100 ~/ total;
        // _logDownload("下载进度 $percent");
        onProgress?.call(percent);
        if (percent >= 100) {
          _logDownload("下载完成 $savePath");
          onSuccess.call(savePath);
        }
      }
    });
  } on DioError catch (e) {
    _logDownload("下载失败 $e");
    onError?.call(ErrorEntity(code: -10, message: Strings.httpDownloadFailed.tr));
  } on Exception catch (e) {
    _logDownload("下载失败 $e");
    onError?.call(ErrorEntity(code: -10, message: Strings.httpDownloadFailed.tr));
  } finally {
    onFinish?.call();
  }
}