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

Flutter注册功能重复邮箱提交时snackbar返回null问题求解

问题原因及修复方案

你遇到的问题是由3处错误共同导致的,按优先级修改即可:

1. 响应模型解析逻辑错误

你当前RegisterResponse的fromJson方法中,message字段错误绑定了json['email'],同时token的判空逻辑写反了,这是你拿不到提示文本的核心原因。
修改后的fromJson代码:

factory RegisterResponse.fromJson(Map<String, dynamic> json) =>
    RegisterResponse(
      name: json['name'], 
      email: json['email'], 
      password: json['password'],
      // 修复token判空逻辑:token不为空时取返回值,否则返回空串
      token: json['token'] != null ? json['token'] as String : '',
      error: json['error'],
      // 修复message取值逻辑,从接口返回的message字段取值,如果你接口提示存放在error字段可替换为json['error']
      message: json['message'] as String?,
      success: json['Success']
    );

2. 提示取值对象错误

你在注册接口的回调中,错误使用了本地初始化的_user对象来读取提示信息,_user只存储了本地表单的输入内容,接口返回的数据实际保存在回调参数value中,所以读取到的永远是null。
修改注册按钮的回调逻辑:

registerAPI.register(name, email, password).then((value) => {
  setState(() {
    isApiCallprocess = false;
    // 如果需要持久化保存接口返回内容,可以加这行把返回值赋值给_user
    _user = value;
  }),
  if (value.token?.isNotEmpty ?? false)
    {
      ScaffoldMessenger.of(context).showSnackBar(SnackBar(
          content: Text('${value.name} 注册成功')))
    }
  else
    {
      ScaffoldMessenger.of(context).showSnackBar(SnackBar(
          // 从接口返回的value对象中读取message,加默认值避免空异常
          content: Text(value.message ?? '注册失败,请稍后重试')))
    }
});

3. 状态码兼容不全

通常邮箱已占用的接口会返回422状态码,你当前只处理了200和401两种状态码,如果接口返回422会直接抛出异常,不会进入成功回调。
修改RegisterAPI的状态码判断逻辑:

if (response.statusCode == 200 || response.statusCode == 401 || response.statusCode == 422) {
  print(response.body);
  return RegisterResponse.fromJson(json.decode(response.body));
} else {
  print(response.body);
  throw Exception('Failed to load data');
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:18:01