Flutter Dio网络请求库的高级用法

“在使用Flutter的Dio库进行网络请求时,遇到几个高级功能的使用问题想请教大家:1)如何优雅地实现请求重试机制?特别是针对特定状态码(如502)的自动重试;2)有没有最佳实践来管理多个并发的请求?比如取消特定请求或确保请求顺序;3)Interceptor的使用技巧,比如如何统一处理401认证过期的情况?4)在文件上传/下载时,怎样实现进度回调并显示到UI?5)Dio如何与Riverpod或Bloc等状态管理方案更好地结合?希望能分享一些实际项目中的经验,谢谢!”

3 回复

Dio 是 Flutter 中非常流行的网络请求库。它的高级用法包括:

  1. 拦截器:可以全局拦截请求和响应,比如添加 Token、处理错误或日志记录。

    dio.interceptors.add(InterceptorsWrapper(
        onRequest: (options, handler) {
          options.headers['Authorization'] = 'Bearer $token';
          return handler.next(options);
        },
        onResponse: (response, handler) {
          print(response.data);
          return handler.next(response);
        },
        onError: (err, handler) {
          print(err.message);
          return handler.next(err);
        },
    ));
    
  2. 超时设置:对不同请求设置不同的超时时间。

    dio.options.connectTimeout = 5000; // 5秒连接超时
    dio.options.receiveTimeout = 3000; // 3秒接收超时
    
  3. FormData 上传:支持文件上传。

    var formData = FormData.fromMap({
      'file': await MultipartFile.fromFile(file.path, filename: file.name),
    });
    dio.post('/upload', data: formData);
    
  4. 自定义适配器:如使用 Mock 数据模拟接口。

    dio.httpClientAdapter = MockAdapter((adapter) {
      adapter.onGet('/test').reply(200, {'data': 'mock'});
    });
    

这些高级用法能让 Dio 更加灵活,满足复杂的业务需求。

更多关于Flutter Dio网络请求库的高级用法的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


Dio 是一个强大的 Flutter 网络请求库,其高级用法主要包括拦截器、自定义适配器、并发请求等。

  1. 拦截器(Interceptors):通过 interceptors 可以拦截请求和响应。例如添加 token 认证或日志记录:

    dio.interceptors.add(InterceptorsWrapper(
        onRequest: (options, handler) {
          options.headers['Authorization'] = 'Bearer your_token';
          return handler.next(options);
        },
        onResponse: (response, handler) {
          print(response.data);
          return handler.next(response);
        }
    ));
    
  2. 超时与错误处理:设置请求超时并捕获异常。

    try {
      await dio.post('/login', data: {"username": "xx", "password": "yy"}, 
                      options: Options(timeout: 5000));
    } catch (e) {
      print(e.toString());
    }
    
  3. 并发请求:同时发起多个请求。

    Future.wait([
      dio.get('/user/1'),
      dio.get('/user/2')
    ]).then((responses) {
      final user1 = responses[0].data;
      final user2 = responses[1].data;
    });
    
  4. 文件上传与下载:支持流式传输,适合大文件操作。

    dio.download('url', '/path/to/save').then((value) => print('Download complete'));
    

这些高级用法让 Dio 更加灵活且功能强大,适用于复杂的网络场景。

Flutter Dio是一个强大的HTTP网络请求库,以下是几个高级用法技巧:

  1. 拦截器(Interceptors) 可用于统一处理请求/响应、添加headers、错误处理等:
dio.interceptors.add(InterceptorsWrapper(
  onRequest: (options, handler) {
    options.headers['token'] = 'your_token';
    return handler.next(options);
  },
  onError: (DioError e, handler) {
    if(e.response?.statusCode == 401) {
      // 处理token失效
    }
    return handler.next(e);
  }
));
  1. 取消请求 使用CancelToken取消正在进行的请求:
final cancelToken = CancelToken();

// 发起请求
dio.get('/url', cancelToken: cancelToken);

// 取消请求
cancelToken.cancel('请求被用户取消');
  1. 文件上传/下载 支持进度监听:
// 文件上传
FormData formData = FormData.fromMap({
  'file': await MultipartFile.fromFile('path/to/file'),
});

dio.post('/upload', 
  data: formData,
  onSendProgress: (sent, total) {
    print('${sent / total * 100}%');
  }
);

// 文件下载
dio.download(
  'url', 
  'save/path',
  onReceiveProgress: (received, total) {
    print('${received / total * 100}%');
  }
);
  1. 请求重试 使用retry包实现自动重试:
dio.interceptors.add(
  RetryInterceptor(
    dio: dio,
    retries: 3, // 重试次数
    retryDelays: [
      Duration(seconds: 1),
      Duration(seconds: 2),
    ],
  ),
);
  1. 自定义适配器 可替换默认的HTTP实现(如使用原生平台能力):
dio.httpClientAdapter = CustomAdapter();

这些高级功能可以让网络请求更灵活高效,建议根据项目需求选择使用。

回到顶部