You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dio如何添加多个拦截器?已加Header拦截器需新增日志拦截器

Dio 添加多个拦截器的正确实现方法

你有两种简单的方式给已有的Dio对象添加第二个拦截器:

方式一:链式调用 add 方法

利用Dio的级联操作符(..),可以在同一个对象上连续添加多个拦截器,直接在现有代码后追加一行即可:

Provider(create: (BuildContext context) =>
Dio(BaseOptions(baseUrl: ApiEndPoints.baseURL))
..interceptors.add(InterceptorsWrapper(
  onRequest: (options, handler) {
    final accessToken = accessTokenChangeNotifier.value;
    if (accessToken != null && accessToken.isNotEmpty) {
      options.headers['Authorization'] = accessToken;
    }
    options.headers[HttpHeaders.contentTypeHeader] = "application/json";
    handler.next(options);
  } ,
  onError: (error , handler) async{
    try {
      handler.resolve(error.response!);
    } catch (e) {
      return handler.next(error);
    }
  },
))
..interceptors.add(CurlLoggerDioInterceptor()), // 直接链式添加日志拦截器
)

方式二:使用 addAll 批量添加

如果后续需要添加更多拦截器,用addAll把所有拦截器放在列表中一次性添加,代码结构更清晰:

Provider(create: (BuildContext context) {
  // 先初始化Dio对象
  final dio = Dio(BaseOptions(baseUrl: ApiEndPoints.baseURL));
  
  // 批量添加所有拦截器
  dio.interceptors.addAll([
    // 原有的请求头拦截器
    InterceptorsWrapper(
      onRequest: (options, handler) {
        final accessToken = accessTokenChangeNotifier.value;
        if (accessToken != null && accessToken.isNotEmpty) {
          options.headers['Authorization'] = accessToken;
        }
        options.headers[HttpHeaders.contentTypeHeader] = "application/json";
        handler.next(options);
      },
      onError: (error, handler) async {
        try {
          handler.resolve(error.response!);
        } catch (e) {
          return handler.next(error);
        }
      },
    ),
    // 新增的日志拦截器
    CurlLoggerDioInterceptor(),
  ]);
  
  return dio;
}),

两种方式都能实现需求,可根据拦截器的数量选择合适的写法。

内容的提问来源于stack exchange,提问作者Ghazal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 18:15:07