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

Dart中GET请求函数内无法访问response变量问题排查

问题根因

await _dio.get(baseUrl) 执行后后续代码无法触发、未进入DioError捕获分支,核心原因分两类:

  • 请求流程被永久挂起,既没有返回成功响应也没有抛出错误
  • 请求过程中抛出了非DioError类型的异常,没有被现有捕获逻辑拦截,直接中断了方法执行

常见触发场景:

  • Dio实例未配置超时时间,请求建立连接/接收数据阶段卡死,一直处于pending状态
  • 设备网络异常、域名解析失败、请求被系统防火墙/代理拦截时,抛出了SocketException等非DioError类型的系统异常
  • Dart空安全模式下,Response response;为非空类型声明,运行时类型校验不通过直接抛出类型系统异常
  • 自定义Dio拦截器未调用handler.next/resolve/reject方法,直接中断了整个请求链路,永远不会返回结果
修复步骤
  1. 初始化Dio实例时补全超时配置,避免请求无限挂起
  2. 扩大异常捕获范围,不要仅捕获DioError,覆盖所有可能的异常类型
  3. 适配Dart空安全规则,避免类型异常
  4. 排查拦截器逻辑,确保所有分支最终都能放行请求

修复后的可运行代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.06 16:15:42