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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:54:05