1、导入网络插件 dio: ^5.3.4
2、引入插件import ‘package:dio/dio.dart’;
3、代码

/// 下载进度回调
typedef OnDownloadProgress = void Function(double progressPercent);  // progressPercent: 0~100
/// 下载成功回调
typedef OnDownloadSuccess = void Function(String filePath);
/// 下载失败回调
typedef OnDownloadError = void Function(Object error, StackTrace? stackTrace);

class NetworkMange {
  static final NetworkMange _instance = NetworkMange._internal();
  factory NetworkMange() => _instance;

  late Dio dio;
  NetworkMange._internal() {
    BaseOptions options = BaseOptions(
      baseUrl: APIUtil.getBaseIpUrl(),
      connectTimeout: const Duration(seconds: 60), // 连接超时
      receiveTimeout: const Duration(seconds: 40), // 接收超时
      headers: {
        'Content-Type': 'application/json', // 默认请求头
      },
    );
    dio = Dio(options);
  }

Future<void> downloadFile(String url, String filePath, {
    OnDownloadProgress? onProgress,
    OnDownloadSuccess? onSuccess,
    OnDownloadError? onError,
  }) async {

    try{
      await dio.download(url, filePath,onReceiveProgress:(received,total){
        if (total != -1) {
          double progress = (received / total) * 100;
          LogUtil.d("下载进度: ${progress.toStringAsFixed(2)}%");
          onProgress?.call(progress);
        }
      },deleteOnError: true);
      onSuccess?.call(filePath);
    }catch(e,stack){
      LogUtil.e('==错误信息===e:$e');
      onError?.call(e, stack);
    }

  }


    /*文件上传*/
  Future<Response> uploadFile(
    String path, {
    required FormData data,
    Map<String, dynamic>? header,
    void Function(int, int)? progress,
  }) async {
    try {
      final options = _mergeHeaders(header);
      final response = await dio.post(
        path,
        data: data,
        options: options,
        onSendProgress: progress,
      );
      return response;
    } catch (e) {
      LogUtil.e('=uploadFile==报错了: $e');
      rethrow;
    }
  }

  // 私有方法:合并默认头与自定义头
  Options _mergeHeaders(Map<String, dynamic>? customHeaders) {
    final mergedHeaders = <String, dynamic>{};
    mergedHeaders.addAll(dio.options.headers);
    if (customHeaders != null) {
      mergedHeaders.addAll(customHeaders);
    }
    return Options(headers: mergedHeaders);
  }

  Future<Response> getRequest(
    String path, {
    Map<String, dynamic>? queryParameters,
    Map<String, dynamic>? headers,
  }) async {
    try {
      final options = headers != null ? Options(headers: headers) : null;
      final response = await dio.get(
        path,
        queryParameters: queryParameters,
        options: options,
      );
      return response;
    } catch (e) {
      LogUtil.e('GET Request Error: ${e}');
      rethrow;
    }
  }

  Future<Map<String,dynamic>?> postRequestResponseMap(
      String path, {
        dynamic data,
        Map<String, dynamic>? headers,
      }) async {
    try {
      final options = headers != null ? Options(headers: headers) : null;
      LogUtil.d('===options==:$options,path:$path');
      final response = await dio.post(path, data: data, options: options);
      Map<String, dynamic> jsonMap;
      if (response.data is Map<String, dynamic>) {
        jsonMap = response.data;
      } else if (response.data is String) {
        jsonMap = jsonDecode(response.data);
      } else {
        throw Exception('返回数据报错 response type: ${response.data.runtimeType}');
      }
      return jsonMap;
    } catch (e) {
      LogUtil.e('POST Request Error: ${e}');
      rethrow;
    }
  }


  //post请求
  Future<Response> postRequest(
    String path, {
    dynamic data,
    Map<String, dynamic>? headers,
  }) async {
    try {
      final options = headers != null ? Options(headers: headers) : null;
      final response = await dio.post(path, data: data, options: options);
      return response;
    } catch (e) {
      LogUtil.e('POST Request Error: ${e}');
      rethrow;
    }
  }
}




`

更多推荐