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

Flutter使用SharedPreferences保持登录后跳转User页为空如何解决

问题根因

你当前的问题核心是冷启动调用getPref()自动跳转时,id、phone两个变量没有被赋值:

  • 只有用户手动触发登录、请求后端登录接口拿到返回数据后,才会给id、phone变量赋值
  • APP冷启动走自动登录逻辑时,这两个变量还是初始的null值,直接传给User页就会导致页面数据为空
  • 你当前的savePref()方法只存储了用户名、密码、token,没有把需要的id、phone持久化到本地,自然无法在自动登录时读取到对应值
修复步骤
  1. 修改savePref()方法,将id、phone也存入SharedPreferences
  2. 修改getPref()方法,从本地存储读取id、phone后再传给User页面
修改后的代码

调整后的savePref和getPref逻辑如下:

// 修改savePref,新增id、phone存储
savePref() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  prefs.setString('username', username);
  prefs.setString('password', password);
  prefs.setString('token', mytoken);
  // 新增存储id和phone
  prefs.setString('id', id);
  prefs.setString('phone', phone);
}

// 修改getPref,读取id、phone后再传参跳转
getPref() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  user = prefs.getString('username');
  pass = prefs.getString('password');
  // 读取本地存储的id和phone
  String localId = prefs.getString('id');
  String localPhone = prefs.getString('phone');

  if (user != null && localId != null) {
    Navigator.pushReplacement(
        context,
        MaterialPageRoute(
            builder: (context) => User(
                  id: localId,
                  phone: localPhone,
                )));
  } else {
    print('Login');
  }
}
补充建议

不要明文存储用户密码到本地,存在敏感信息泄露风险,可按以下逻辑优化:

  • 登录成功后只存储token、id、phone、username即可
  • 后续校验登录状态直接校验token有效性,不需要本地留存密码

内容的提问来源于stack exchange,提问作者Farou2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:12:00