Flutter登录报错type 'Null' is not a 'bool'问题排查求助
问题原因及修复方案
核心错误原因
你遇到的type 'Null' is not a 'bool' in boolean expression错误,是代码中对接口返回字段的空安全处理缺失导致的:
在login方法中你直接写了if(!resposne['error']),如果后端返回的JSON响应中不存在error字段,或者该字段返回值为null,就会出现用null做布尔运算的非法操作,直接抛出该异常。
其他存在的Bug
- 密码输入框的
onSaved回调逻辑写错:你将密码输入框的保存值赋值给了mobile变量,若后续使用_formKey.currentState?.save()获取表单值,会导致手机号被密码覆盖。 - 接口请求格式可能不匹配:你代码中设置的
Content-Type是application/x-www-form-urlencoded,如果Postman中你发送的是JSON格式的请求参数,也会导致后端无法正常解析请求,返回不符合预期的响应结构。 - 响应字段读取无判空:你直接读取
resposne['data']、user['name']、user['email']等字段,若这些字段不存在或者为null,后续还会触发空异常。 - 变量拼写错误:你将响应变量名拼错为
resposne,正确拼写应为response。
修复步骤
1. 修复布尔判断的空安全问题
将login方法中对error字段的判断修改为:
// 若error字段为null默认判定为请求错误 if (!(resposne['error'] ?? true)) { // 原有成功逻辑 }
更严谨的写法:
if (resposne.containsKey('error') && resposne['error'] == false) { // 原有成功逻辑 }
2. 修复密码输入框的保存逻辑
找到密码对应的TextFormField组件,修改onSaved回调:
onSaved: (val) { password = val!; // 原代码写的是mobile = val!,修改为password },
3. 匹配接口请求格式
如果Postman中你发送的是JSON格式参数,将请求代码修改为:
final response= await http.post( Uri.parse(LOGIN), headers: { "Accept": "application/json", "Content-Type": "application/json" }, body: jsonEncode(data), encoding: Encoding.getByName("utf-8") );
如果接口确实接收表单格式参数,保留原有请求头即可。
4. 给所有响应字段读取逻辑加判空
比如读取用户信息的逻辑可以修改为:
if(resposne.containsKey('data')) { Map<String,dynamic>user=resposne['data']; print(" LoginId ${user['LoginId'] ?? '未获取到'}"); savePref( 1, user['name'] ?? '', user['email'] ?? '', user['id'] ?? 0 ); Navigator.pushReplacementNamed(context, "/home"); }
内容的提问来源于stack exchange,提问作者Jyothi Sri
相关产品推荐
相关产品推荐

