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
相关产品推荐
相关产品推荐

