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

Flutter从SharedPreferences取值转Provider时出现FormatException如何解决

问题根因

你遇到的格式异常是因为存入SharedPreferences的字符串不符合标准JSON规范:
Dart自定义对象调用默认toString()方法输出的键值对不会给字符串键加双引号,比如你存储的内容格式为{token: eyJh...},而jsonDecode要求输入的JSON字符串的键必须用双引号包裹(合法格式为{"token":"eyJh..."}),因此解析时抛出异常。

修复步骤
  1. 修正存储逻辑,存入前先将User对象转为标准JSON字符串
    你需要先调用User类的toJson()方法转成Map结构,再用jsonEncode序列化为合法JSON字符串后再存入,替换原有存储代码:
// 原错误代码
// _localStorage.setValue(Constants.USER, user.toString());

// 修正后代码
_localStorage.setValue(Constants.USER, jsonEncode(user.toJson()));

注:如果你的User类还没有实现toJson()方法,需要补充实现,通常用json_serializable注解生成的实体类会自动生成该方法。

  1. 读取逻辑可补充非空校验,避免空值异常
    读取侧逻辑基本不需要修改,可增加空值判断增强鲁棒性:
Future<void> insertUsertolocal() async {
  final storage = LocalStorage();
  final _userStr = await storage.getValue(Constants.USER);
  if (_userStr != null) {
    User user = User.fromJson(jsonDecode(_userStr));
    print(user.email);
    // 后续将user传递给Provider即可
  }
}
验证方法

修改后可在存储前打印jsonEncode(user.toJson())的输出结果,确认键都被双引号包裹,即可保证解析正常。

内容的提问来源于stack exchange,提问作者Febin Johnson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 22:09:00