Dart中GET请求函数内无法访问response变量问题排查
问题根因
await _dio.get(baseUrl) 执行后后续代码无法触发、未进入DioError捕获分支,核心原因分两类:
- 请求流程被永久挂起,既没有返回成功响应也没有抛出错误
- 请求过程中抛出了非
DioError类型的异常,没有被现有捕获逻辑拦截,直接中断了方法执行
常见触发场景:
- Dio实例未配置超时时间,请求建立连接/接收数据阶段卡死,一直处于pending状态
- 设备网络异常、域名解析失败、请求被系统防火墙/代理拦截时,抛出了
SocketException等非DioError类型的系统异常 - Dart空安全模式下,
Response response;为非空类型声明,运行时类型校验不通过直接抛出类型系统异常 - 自定义Dio拦截器未调用
handler.next/resolve/reject方法,直接中断了整个请求链路,永远不会返回结果
修复步骤
- 初始化Dio实例时补全超时配置,避免请求无限挂起
- 扩大异常捕获范围,不要仅捕获DioError,覆盖所有可能的异常类型
- 适配Dart空安全规则,避免类型异常
- 排查拦截器逻辑,确保所有分支最终都能放行请求
修复后的可运行代码:
import 'package:dio/dio.dart'; class NetworkUtil { late final Dio _dio; NetworkUtil() { _dio = Dio(BaseOptions( connectTimeout: const Duration(seconds: 10), receiveTimeout: const Duration(seconds: 10), sendTimeout: const Duration(seconds: 10), // 可按需补充公共headers、baseUrl等配置 )); // 如果有自定义拦截器,务必确认每个逻辑分支都正确调用handler方法 // _dio.interceptors.add(InterceptorsWrapper( // onRequest: (options, handler) { // // 逻辑处理完成后必须调用handler.next放行 // handler.next(options); // }, // )); } Future<Response> getRequest(String baseUrl) async { Response? response; try { response = await _dio.get(baseUrl); print('请求成功,响应状态码:${response.statusCode}'); } on DioError catch (e) { print('Dio请求错误:${e.message},错误类型:${e.type}'); throw Exception(e.message); } catch (e) { // 捕获所有其他类型异常,包括系统网络错误、类型错误等 print('请求流程异常:${e.toString()}'); throw Exception(e.toString()); } if (response == null) { throw Exception('未获取到有效响应'); } return response; } }
排查提示:如果修改后依然没有任何日志输出,优先检查拦截器逻辑、设备网络代理配置,确认请求是否真正被发出。
内容的提问来源于stack exchange,提问作者CodeTemplar
相关产品推荐
相关产品推荐

