Flutter中如何使用dio拦截器
在Flutter项目中,我正在使用dio库进行网络请求,想为请求和响应添加拦截器来实现统一处理。请问如何正确配置dio拦截器?比如需要在请求头添加token,或者对响应数据做统一错误处理。能否提供一个完整的拦截器实现示例?另外,多个拦截器的执行顺序是怎样的?
2 回复
在Flutter中使用Dio拦截器可以方便地处理请求和响应的统一逻辑,例如添加认证头、日志记录或错误处理。以下是具体实现方法:
1. 添加依赖
在 pubspec.yaml 中添加:
dependencies:
dio: ^5.0.0
2. 创建拦截器
请求拦截器示例:
import 'package:dio/dio.dart';
// 创建Dio实例
final dio = Dio();
// 添加请求拦截器
dio.interceptors.add(InterceptorsWrapper(
onRequest: (RequestOptions options, RequestInterceptorHandler handler) {
// 在请求发送前添加认证头
options.headers['Authorization'] = 'Bearer your_token_here';
// 打印请求日志
print('${options.method} → ${options.uri}');
return handler.next(options); // 继续请求
},
));
响应拦截器示例:
dio.interceptors.add(InterceptorsWrapper(
onResponse: (Response response, ResponseInterceptorHandler handler) {
print('Response ← ${response.statusCode}');
return handler.next(response);
},
onError: (DioException error, ErrorInterceptorHandler handler) {
print('Error ← ${error.response?.statusCode}');
return handler.next(error);
},
));
3. 完整使用示例
void main() async {
final dio = Dio(BaseOptions(baseUrl: 'https://api.example.com'));
// 添加拦截器
dio.interceptors.add(InterceptorsWrapper(
onRequest: (options, handler) {
options.headers['Content-Type'] = 'application/json';
print('🚀 Sending: ${options.method} ${options.uri}');
handler.next(options);
},
onResponse: (response, handler) {
print('✅ Received: ${response.statusCode}');
handler.next(response);
},
onError: (error, handler) {
print('❌ Error: ${error.message}');
handler.reject(error);
},
));
// 发送请求
try {
final response = await dio.get('/users');
print(response.data);
} catch (e) {
print('Request failed: $e');
}
}
4. 高级用法
- 队列请求:使用
handler.reject和dio.lock()/dio.unlock()实现认证刷新 - 重试机制:在
onError中实现请求重试逻辑 - 自定义拦截器:继承
Interceptor类创建独立拦截器
注意事项
- 确保调用
handler.next()或handler.reject()避免请求挂起 - 拦截器按添加顺序执行
- 使用
QueuedInterceptorsWrapper处理异步操作
这样即可通过拦截器统一管理网络请求的通用逻辑。


