Flutter使用SharedPreferences保持登录后跳转User页为空如何解决
问题根因
你当前的问题核心是冷启动调用getPref()自动跳转时,id、phone两个变量没有被赋值:
- 只有用户手动触发登录、请求后端登录接口拿到返回数据后,才会给
id、phone变量赋值 - APP冷启动走自动登录逻辑时,这两个变量还是初始的null值,直接传给
User页就会导致页面数据为空 - 你当前的
savePref()方法只存储了用户名、密码、token,没有把需要的id、phone持久化到本地,自然无法在自动登录时读取到对应值
修复步骤
- 修改
savePref()方法,将id、phone也存入SharedPreferences - 修改
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
相关产品推荐
相关产品推荐

