Flutter Dio网络请求库的高级用法
“在使用Flutter的Dio库进行网络请求时,遇到几个高级功能的使用问题想请教大家:1)如何优雅地实现请求重试机制?特别是针对特定状态码(如502)的自动重试;2)有没有最佳实践来管理多个并发的请求?比如取消特定请求或确保请求顺序;3)Interceptor的使用技巧,比如如何统一处理401认证过期的情况?4)在文件上传/下载时,怎样实现进度回调并显示到UI?5)Dio如何与Riverpod或Bloc等状态管理方案更好地结合?希望能分享一些实际项目中的经验,谢谢!”
Dio 是 Flutter 中非常流行的网络请求库。它的高级用法包括:
-
拦截器:可以全局拦截请求和响应,比如添加 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); }, ));
-
超时设置:对不同请求设置不同的超时时间。
dio.options.connectTimeout = 5000; // 5秒连接超时 dio.options.receiveTimeout = 3000; // 3秒接收超时
-
FormData 上传:支持文件上传。
var formData = FormData.fromMap({ 'file': await MultipartFile.fromFile(file.path, filename: file.name), }); dio.post('/upload', data: formData);
-
自定义适配器:如使用 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 网络请求库,其高级用法主要包括拦截器、自定义适配器、并发请求等。
-
拦截器(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); } ));
-
超时与错误处理:设置请求超时并捕获异常。
try { await dio.post('/login', data: {"username": "xx", "password": "yy"}, options: Options(timeout: 5000)); } catch (e) { print(e.toString()); }
-
并发请求:同时发起多个请求。
Future.wait([ dio.get('/user/1'), dio.get('/user/2') ]).then((responses) { final user1 = responses[0].data; final user2 = responses[1].data; });
-
文件上传与下载:支持流式传输,适合大文件操作。
dio.download('url', '/path/to/save').then((value) => print('Download complete'));
这些高级用法让 Dio 更加灵活且功能强大,适用于复杂的网络场景。
Flutter Dio是一个强大的HTTP网络请求库,以下是几个高级用法技巧:
- 拦截器(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);
}
));
- 取消请求 使用CancelToken取消正在进行的请求:
final cancelToken = CancelToken();
// 发起请求
dio.get('/url', cancelToken: cancelToken);
// 取消请求
cancelToken.cancel('请求被用户取消');
- 文件上传/下载 支持进度监听:
// 文件上传
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}%');
}
);
- 请求重试 使用retry包实现自动重试:
dio.interceptors.add(
RetryInterceptor(
dio: dio,
retries: 3, // 重试次数
retryDelays: [
Duration(seconds: 1),
Duration(seconds: 2),
],
),
);
- 自定义适配器 可替换默认的HTTP实现(如使用原生平台能力):
dio.httpClientAdapter = CustomAdapter();
这些高级功能可以让网络请求更灵活高效,建议根据项目需求选择使用。