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

