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

Flutter中SharedPreferences存储用户登录数据后读取返回null的问题

解决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;
}

额外验证步骤

除了修复读取逻辑,建议你确认存储环节是否正常:

  1. 验证存储结果:在存储代码后立即读取并打印,确认数据已存入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)。

  1. 确认StorageService初始化:确保Global.service是已经通过initSharedPreference()初始化后的实例,比如在main函数里:
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  // 必须等待初始化完成再使用
  Global.service = await StorageService().initSharedPreference();
  runApp(const MyApp());
}
  1. 检查key的一致性:确认存储和读取时使用的AppConstants.STORAGE_USER_PROFILE_KEY是同一个常量,避免拼写错误。

内容的提问来源于stack exchange,提问作者Ukeme Elijah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 11:48:23