Flutter模拟器不展示API注册成功响应但终端可查看该如何解决?
问题原因与解决方案
核心问题1:成功提示代码被注释
你代码中成功分支下的SnackBar弹出逻辑被双斜杠//注释掉了,自然不会在模拟器弹出提示。错误分支你应该是写了对应的展示逻辑所以能正常显示。
核心问题2:succMsg赋值未触发UI刷新
你给succMsg变量赋值的操作没有包裹在setState方法中,即便你的页面有写展示succMsg的组件,也不会触发UI重绘,自然看不到成功提示。
核心问题3:接口返回无token字段会触发空异常
从你终端打印的接口返回结果看,响应体里只有status、message、seedPhase三个字段,没有你代码中取的token字段,执行sharedPreferences.setString("token", jsonResponse['token']);会直接抛出空指针异常,打断后续代码执行,即便你没注释SnackBar代码也跑不到对应逻辑。
修复代码示例
Register(String email, userid, pass, confpass) async { SharedPreferences sharedPreferences = await SharedPreferences.getInstance(); Map data = { 'email': email, 'userId': userid, 'password': pass, 'confirmPassword': confpass }; var jsonResponse = null; var response = await http.post(Uri.parse("http://10.0.2.2:8000/register"), body: data); if(response.statusCode == 201) { jsonResponse = json.decode(response.body); print(jsonResponse); if(jsonResponse != null) { // 把状态更新和变量赋值都放到setState里 setState(() { _isLoading = false; succMsg = jsonResponse['message']; }); print("success: ${response.body}"); // 先判断token是否存在再存储,避免空异常 if(jsonResponse.containsKey('token') && jsonResponse['token'] != null) { sharedPreferences.setString("token", jsonResponse['token']); } else { print("后端未返回token字段,请检查接口逻辑"); } // 取消SnackBar代码的注释 ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(jsonResponse['message']))); // 需要跳转的话也取消下面这行的注释 //Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (BuildContext context) => MainPage()), (Route<dynamic> route) => false); } } else { setState(() { _isLoading = false; errorMsg = response.body; }); print("The error message is: ${response.body}"); // 错误分支的提示逻辑保留即可 ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(errorMsg), backgroundColor: Colors.red,)); } }
内容的提问来源于stack exchange,提问作者Susmita Kar
相关产品推荐
相关产品推荐

