调试时Dio发起重复请求问题排查与解决
解决调试时Dio重复发起请求的问题
1. 修复Dio实例创建方式(核心问题)
你当前通过getter每次调用都会新建Dio实例,调试时单步执行可能多次触发这个getter,导致多个Dio实例各自发起请求。改成单例模式,确保全局只有一个Dio实例:
// 只初始化一次Dio实例 final Dio _dio = Dio(BaseOptions( baseUrl: '${getIt<ConfigReader>().baseURL}${getIt<ConfigReader>().apiPath}', contentType: Headers.jsonContentType, responseType: ResponseType.json, headers: { 'Accept': Headers.jsonContentType, }, )) ..interceptors.add(LogInterceptor()); // 全局复用同一个实例 Dio get dio => _dio;
2. 检查请求触发逻辑
调试时的断点暂停可能导致代码逻辑重复触发请求:
- 确认请求调用是否在按钮点击、
initState/didChangeDependencies等生命周期方法中,调试暂停后是否触发这些方法重复执行 - 检查是否有防抖/节流逻辑,调试时是否绕过了这些限制导致重复调用
3. 排查隐式重试机制
虽然你只添加了LogInterceptor,但可以排查以下可能:
- 临时调大Dio的
connectTimeout和receiveTimeout值,避免调试断点导致超时触发底层网络重试 - 检查系统层面是否有HTTP请求重试的全局配置
4. 追踪请求发起实例
在请求调用处添加日志,打印Dio实例的hashCode,确认是否是同一实例发起的多请求:
print("请求发起实例hash: ${dio.hashCode}"); dio.post('/auth').then(...);
如果调试时打印多个不同hash值,说明还是实例重复创建的问题,回到步骤1彻底修复。
内容的提问来源于stack exchange,提问作者Ariel
相关产品推荐
相关产品推荐

