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

Flutter注册成功后无法跳转WelcomeScreen报FormatException如何解决

问题根因
  • 跳转不触发的直接原因是代码执行到jsonDecode(response.body)时抛出了格式异常,后续的路由跳转逻辑根本没有执行到,直接进入catch分支打印了错误。
  • 从控制台输出可以看到,注册接口signup.php返回的内容是纯文本user added successfully,不是标准JSON格式,jsonDecode无法解析非JSON格式的字符串,因此抛出FormatException: Unexpected character错误。
  • 登录场景下跳转正常,是因为登录接口返回的是合法JSON格式内容,解析过程不会抛错,后续跳转逻辑可以正常执行。
修复方案

你可以任选以下一种方案修复,优先推荐统一接口返回格式的方案:

  • 方案1:调整后端接口返回逻辑
    修改signup.php的输出逻辑,和登录接口保持一致,统一返回标准JSON格式内容,不要直接输出纯文本。例如注册成功时返回结构:
    {"code":0,"msg":"user added successfully"}
    
    注册失败时返回对应错误结构的JSON,保证前端可以正常解析。
  • 方案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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 05:09:21