Flutter注册重复手机号未触发SnackBar问题排查求助
问题分析与解决建议
核心问题
MongoDB中已存在目标手机号,使用该手机号注册时,前端未按预期弹出SnackBar提示重复注册。
前端(Flutter)代码问题点
1. 手机号查重逻辑错误
在mongoconnection方法中,checkNumber是从数据库查询到的完整用户文档对象,不是手机号字符串,直接用number == checkNumber对比永远不成立:
// 错误写法 if (number == checkNumber) { ... } // 正确写法:对比文档中的phoneNumber字段 if (checkNumber != null && number == checkNumber['phoneNumber']) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text("手机号已存在")) ); }
2. 异步方法调用逻辑混乱
UserData方法中,将异步方法加入数组后直接通过switch调用的写法完全无效:既没有等待异步操作完成,也存在索引越界风险,根本不会按预期执行查重或注册逻辑:
// 错误写法 void UserData() { var UserAndConnection = []; UserAndConnection.add(registerUser()); UserAndConnection.add(mongoconnection()); switch (UserAndConnection.length) { case 1: UserAndConnection[1]; // 数组长度为1时索引1越界,且未await break; case 2: UserAndConnection[0]; // 未await,异步方法不会执行完成 break; default: break; } }
正确逻辑应该是先完成查重,再决定是否执行注册:
// 重构为异步方法 Future<void> UserData() async { // 先执行手机号查重 await mongoconnection(); // 可选:根据查重结果决定是否调用注册接口 // 例如:若mongoconnection返回bool值表示是否存在,再判断是否注册 }
3. 注册接口调用未处理异步状态
registerUser方法中,http.post没有加await,导致sendUserDetails是未完成的Future对象,后续解析sendUserDetails.body会直接报错:
// 错误写法 sendUserDetails = http.post(...); // 正确写法 sendUserDetails = await http.post(...);
后端(Node.js)逻辑说明
后端已经实现了手机号查重:查询到已存在手机号时返回404并抛出错误,但前端未处理该错误响应。建议前端直接通过后端接口的响应状态码来触发提示:
Future registerUser() async { try { var registerdetails = {"phoneNumber": number, "password": password}; if (number.isEmpty || password.isEmpty) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text("手机号和密码不能为空")) ); return; } final response = await http.post( Uri.parse(register), headers: {"Content-Type": "application/json"}, body: jsonEncode(registerdetails) ); if (response.statusCode == 404) { // 后端返回手机号已存在 ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text("手机号已存在")) ); } else if (response.statusCode == 200) { // 注册成功逻辑 ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text("注册成功")) ); } } catch (e) { print(e.toString()); ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text("注册失败,请重试")) ); } }
推荐优化方案
- 移除前端直连MongoDB的逻辑:前端直接连接数据库存在严重安全风险,所有数据操作应统一通过后端接口完成。
- 简化流程:点击注册时直接调用后端注册接口,由后端完成查重和创建用户,前端根据后端返回的状态码或错误信息弹出对应提示。
- 规范异步操作:所有异步方法必须使用
await等待执行完成,避免逻辑顺序混乱。
内容的提问来源于stack exchange,提问作者Jaden Appiah
相关产品推荐
相关产品推荐

