Flutter中SharedPreferences数据赋值全局变量时出现空值问题的解决方法及原因解析
问题原因分析
嘿,这问题其实是个典型的赋值方向搞反的小失误!你看代码里这行:
userID = getUserId;
这是把**初始为null的全局变量getUserId**赋值给了从SharedPreferences拿到的局部userID,完全搞反了赋值逻辑!这就导致第二个打印输出的是原本为空的全局变量值,而非你从本地存储取出的正确数据。
至于字符串类型出现空字符串的情况,本质也是类似逻辑错误:要么是赋值方向搞反,要么是没处理SharedPreferences返回null的场景,直接把null当成空字符串使用了。
解决方法
1. 修正赋值方向
把赋值语句反过来,将从SharedPreferences拿到的值存入全局变量:
int? getUserId; // 全局变量 Future fetch() async { var pref = await SharedPreferences.getInstance(); var userID = pref.getInt('userID'); print("userID from SharedPreferences: " + userID.toString()); // 正确赋值:把局部获取的值赋值给全局变量 getUserId = userID; print("userID in global variable: " + getUserId.toString()); }
2. 等待异步操作完成
fetch()是异步方法,如果直接调用后立刻使用getUserId,大概率会因为异步操作未完成,拿到的还是null。调用时一定要用await等待执行完毕:
比如在页面的initState中加载数据:
@override void initState() { super.initState(); _loadUserData(); } Future _loadUserData() async { await fetch(); // 此时getUserId已完成赋值,可放心使用 if (getUserId != null) { // 执行后续业务逻辑,比如请求用户详情等 } }
3. 处理空值/设置默认值
不管是整型还是字符串,都要处理SharedPreferences返回null的场景(比如用户首次登录未存数据、数据被清除),避免空值或空字符串问题:
- 整型处理:
// 若未获取到userID,设置默认值(比如0,可根据业务调整) getUserId = pref.getInt('userID') ?? 0;
- 字符串处理:
String? userName; Future fetchUserName() async { var pref = await SharedPreferences.getInstance(); // 若未获取到userName,设置默认空串或提示文本 userName = pref.getString('userName') ?? ""; }
4. (可选)封装SharedPreferences操作
为避免重复编写相似代码,可将SharedPreferences操作封装成工具类,降低出错概率:
class PrefsUtils { static Future<int?> getUserId() async { final pref = await SharedPreferences.getInstance(); return pref.getInt('userID'); } static Future<void> saveUserId(int id) async { final pref = await SharedPreferences.getInstance(); await pref.setInt('userID', id); } }
使用时逻辑更清晰:
Future fetch() async { getUserId = await PrefsUtils.getUserId(); print("global userID: " + getUserId.toString()); }
内容的提问来源于stack exchange,提问作者Usama Hafeez Official
相关产品推荐
相关产品推荐

