Flutter中SharedPreferences存储用户登录数据后读取返回null的问题
你的代码里有两个关键问题导致读取数据返回null,下面是具体诊断和修复方案:
核心问题:getUserProfile方法未返回解析后的实例
看你的getUserProfile方法,当读取到存储的字符串后,你调用了UserItem.fromJson(jsonDecode(offlineProfile))创建实例,但没有把这个实例返回,最后直接return null,所以不管有没有数据都会返回null。
修复后的getUserProfile代码:
UserItem? getUserProfile() { var offlineProfile = _pref.getString(AppConstants.STORAGE_USER_PROFILE_KEY); // 先判断是否为null,再检查非空 if (offlineProfile != null && offlineProfile.isNotEmpty) { // 必须return解析后的UserItem实例 return UserItem.fromJson(jsonDecode(offlineProfile)); } return null; }
额外验证步骤
除了修复读取逻辑,建议你确认存储环节是否正常:
- 验证存储结果:在存储代码后立即读取并打印,确认数据已存入SharedPreferences:
try { Global.service.setString( AppConstants.STORAGE_USER_PROFILE_KEY, jsonEncode(result.data) ); // 添加验证打印 var savedData = Global.service.getString(AppConstants.STORAGE_USER_PROFILE_KEY); print("已存储的用户数据:$savedData"); // ... 页面跳转逻辑 } catch (e) { print("存储错误:${e.toString()}"); }
如果打印出正常的JSON字符串,说明存储没问题;如果为空或报错,检查jsonEncode(result.data)是否正确(你的UserItem已经实现了toJson方法,理论上没问题,但可以确认result.data是否为非null)。
- 确认StorageService初始化:确保
Global.service是已经通过initSharedPreference()初始化后的实例,比如在main函数里:
void main() async { WidgetsFlutterBinding.ensureInitialized(); // 必须等待初始化完成再使用 Global.service = await StorageService().initSharedPreference(); runApp(const MyApp()); }
- 检查key的一致性:确认存储和读取时使用的
AppConstants.STORAGE_USER_PROFILE_KEY是同一个常量,避免拼写错误。
内容的提问来源于stack exchange,提问作者Ukeme Elijah
相关产品推荐
相关产品推荐

