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
相关产品推荐
相关产品推荐

