Flutter注册成功后无法跳转WelcomeScreen报FormatException如何解决
问题根因
- 跳转不触发的直接原因是代码执行到
jsonDecode(response.body)时抛出了格式异常,后续的路由跳转逻辑根本没有执行到,直接进入catch分支打印了错误。 - 从控制台输出可以看到,注册接口
signup.php返回的内容是纯文本user added successfully,不是标准JSON格式,jsonDecode无法解析非JSON格式的字符串,因此抛出FormatException: Unexpected character错误。 - 登录场景下跳转正常,是因为登录接口返回的是合法JSON格式内容,解析过程不会抛错,后续跳转逻辑可以正常执行。
修复方案
你可以任选以下一种方案修复,优先推荐统一接口返回格式的方案:
- 方案1:调整后端接口返回逻辑
修改signup.php的输出逻辑,和登录接口保持一致,统一返回标准JSON格式内容,不要直接输出纯文本。例如注册成功时返回结构:
注册失败时返回对应错误结构的JSON,保证前端可以正常解析。{"code":0,"msg":"user added successfully"} - 方案2:兼容当前后端返回格式,调整前端逻辑
不要把跳转逻辑和JSON解析强绑定,先判断接口返回内容是否匹配成功标识,确认注册成功后再执行跳转,修正后的代码如下:Future signup(BuildContext cont) async{ var url = "http://10.0.2.2:8080/localconnect/signup.php"; var response = await http.post(url, body: { 'username' : username.text, 'password' : password.text, }); try { // 先校验请求结果,当前后端返回纯文本成功提示,直接判断内容即可 if (response.statusCode == 200 && response.body.contains("user added successfully")) { // 确认注册成功再执行跳转 Navigator.push(cont, MaterialPageRoute(builder: (context)=>WelcomeScreen())); } else { // 注册失败场景可在此处加弹窗提示用户 print("注册失败,接口返回:${response.body}"); } // 若后续需要从返回值取结构化字段,再单独做JSON解析,不要将跳转逻辑放在解析之后 }catch(e){ print(e); } }
注意:编写接口请求逻辑时,核心业务动作(比如页面跳转、成功提示)不要和非必要的解析逻辑强绑定,应该先判断请求是否成功、返回内容是否符合成功预期,再执行后续业务逻辑,避免非核心步骤报错打断主流程。
内容的提问来源于stack exchange,提问作者Alex Ali
相关产品推荐
相关产品推荐

