Flutter报ui_dart_state.cc(199)错误 getter 'length'调用在null上如何解决
错误触发原因
- 核心触发点是代码中存在空对象调用
length属性的逻辑,具体可能的原因按优先级排序如下:- 代码内
apiurl被赋值为空字符串,调用Uri.parse(apiurl)生成的Uri对象无效,http库内部执行请求时会校验请求地址长度,空对象调用length直接抛出错误。 email、password两个参数未正确绑定输入框取值逻辑,传入http请求的body时为null,http库处理请求参数时调用length触发报错。- 接口返回的
response.body为空,执行json.decode时解析空内容会调用length属性触发报错;或是返回的JSON结构缺少error、success、message字段,取值后为null,后续业务逻辑中用到这些空值的length时抛出错误。
- 代码内
修复方案
- 第一步:补全有效接口地址,增加地址有效性校验
startLogin() async { String apiurl = "替换为你的实际接口地址"; // 补全正确的接口地址,模拟器环境不要用localhost,用本地网卡IP if(apiurl.isEmpty || !Uri.parse(apiurl).isAbsolute) { setState(() { showprogress = false; error = true; errormsg = "接口地址配置错误"; }); return; } // 原有后续逻辑 }
- 第二步:请求前增加用户名密码空值校验
// 放在接口请求代码之前 if(email?.isEmpty ?? true || password?.isEmpty ?? true) { setState(() { showprogress = false; error = true; errormsg = "用户名或密码不能为空"; }); return; }
- 第三步:增加接口返回值空安全校验
if(response.statusCode == 200){ if(response.body.isEmpty) { setState(() { showprogress = false; error = true; errormsg = "接口返回内容为空"; }); return; } var jsondata = json.decode(response.body); // 校验JSON字段存在性 if(jsondata["error"] == null || jsondata["success"] == null) { setState(() { showprogress = false; error = true; errormsg = "接口返回结构异常"; }); return; } // 原有业务逻辑不变 if(jsondata["error"]){ setState(() { showprogress = false; error = true; errormsg = jsondata["message"] ?? "未知错误"; }); } // ...其余原有代码 }
- 第四步:开启Flutter空安全校验,给所有变量增加可空标记,编译阶段提前识别空值风险。
内容的提问来源于stack exchange,提问作者jerome
相关产品推荐
相关产品推荐

