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

Flutter应用首次安装运行时SharedPreferences返回null问题求助

问题根因
  • 存储环节异步逻辑错误:readData方法未正确等待Firestore查询和SharedPreferences写入操作完成就提前返回,导致登录逻辑在数据还没写入SP的时候就跳转到了首页,首次读取自然为空。热重启时之前的异步写入已经完成,所以能正常读取。
  • 存取key不匹配:存储用户名时用的key是RitechApp.userName,但首页读取时用的key是"name",key不一致也会导致读取结果为null。
  • 首页读取完成后未触发页面刷新:getSP方法拿到SP数据后没有调用setState,就算拿到了值页面也不会更新展示。
修复步骤

1. 修正存储侧异步逻辑

确保readData方法等待所有写入操作完成后再返回,修改代码如下:

Future readData(FirebaseUser fUser) async {
  // 等待Firestore查询完成
  final dataSnapshot = await Firestore.instance
      .collection("users")
      .document(fUser.uid)
      .get();
  // 等待所有SharedPreferences写入操作完成
  await RitechApp.sharedPreferences.setString("uid", dataSnapshot.data[RitechApp.userUID]);
  await RitechApp.sharedPreferences.setString(RitechApp.userEmail, dataSnapshot.data[RitechApp.userEmail]);
  await RitechApp.sharedPreferences.setString(RitechApp.phoneNumber, dataSnapshot.data["phoneNumber"]);
  // 统一存取key,这里用"name"作为用户名的存储key,和后续读取逻辑匹配
  await RitechApp.sharedPreferences.setString("name", dataSnapshot.data[RitechApp.userName]);
}

2. 修正首页读取逻辑

读取到数据后调用setState触发页面重绘,修改getSP方法:

getSP() async {
  SharedPreferences sp = await SharedPreferences.getInstance();
  // 调用setState更新状态,触发页面重绘
  setState(() {
    sharedPreferences = sp;
    _name = sharedPreferences.getString("name");
    _userID = sharedPreferences.getString("uid");
  });
}

3. 新增空值兼容(可选)

给Text组件添加默认值,避免加载阶段出现空指针报错:

Text(
  _name ?? "加载中",
  style: TextStyle(
      fontSize: 25,
      fontFamily: "Muli",
      fontWeight: FontWeight.bold,
      color: kPrimaryColor),
),

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 05:24:03