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

Flutter/Dart中DioError捕获块内对话框不弹出问题排查

问题原因与修复方案

原因分析

当输入错误用户名时,Airtable不会返回HTTP错误(如422),而是返回HTTP 200成功响应,但响应体里的records是空数组。你的代码直接访问response.data['records'][0]['id'],此时空数组取索引0会触发RangeError,而这个错误不在on DioError catch的捕获范围内(该块仅捕获Dio发起请求时的HTTP层面错误),导致程序抛出未处理错误,无法执行到错误处理逻辑里的showInvalidUsernameDialog。

控制台出现的422错误可能是其他场景触发的,但当前问题的核心是未捕获空数组索引导致的运行时错误。

修复后的代码

// Airtable (find a record)
void airtableFind() async {
  try {
    final response = await Dio().get(
      'https://api.airtable.com/v0/$projectBase/$recordName',
      queryParameters: {
        // 优化字符串拼接,避免转义问题
        'filterByFormula': "SEARCH('$username', {Name})"
      },
      options: Options(
        contentType: 'application/json',
        headers: {
          'Authorization': 'Bearer $apiKey',
          'Accept': 'application/json',
        },
      ),
    );

    // 先判断records是否为空,避免索引越界
    final records = response.data['records'];
    if (records == null || records.isEmpty) {
      showInvalidUsernameDialog(context);
      return;
    }

    // 有匹配记录时再提取id
    idString = records[0]['id'];
    // TODO: 添加成功后的逻辑(如提示用户验证通过)

  } on DioError catch (e) {
    // 处理HTTP请求层面的错误(如网络异常、API密钥错误等)
    print(e);
    showInvalidUsernameDialog(context);
  } catch (e) {
    // 捕获所有其他类型的错误(如RangeError、类型转换错误等)
    print('Unexpected error: $e');
    showInvalidUsernameDialog(context);
  }
}

关键修改点

  • 用字符串插值$替代+拼接URL和请求参数,更简洁且避免转义错误
  • 提前检查records是否为空,从源头避免索引越界错误
  • 添加通用catch (e)块,捕获所有非DioError类型的异常,确保任何错误都能触发对话框
  • 修正contentType的大小写为标准的application/json

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:18:33