Flutter从SharedPreferences取值转Provider时出现FormatException如何解决
问题根因
你遇到的格式异常是因为存入SharedPreferences的字符串不符合标准JSON规范:
Dart自定义对象调用默认toString()方法输出的键值对不会给字符串键加双引号,比如你存储的内容格式为{token: eyJh...},而jsonDecode要求输入的JSON字符串的键必须用双引号包裹(合法格式为{"token":"eyJh..."}),因此解析时抛出异常。
修复步骤
- 修正存储逻辑,存入前先将User对象转为标准JSON字符串
你需要先调用User类的toJson()方法转成Map结构,再用jsonEncode序列化为合法JSON字符串后再存入,替换原有存储代码:
// 原错误代码 // _localStorage.setValue(Constants.USER, user.toString()); // 修正后代码 _localStorage.setValue(Constants.USER, jsonEncode(user.toJson()));
注:如果你的User类还没有实现
toJson()方法,需要补充实现,通常用json_serializable注解生成的实体类会自动生成该方法。
- 读取逻辑可补充非空校验,避免空值异常
读取侧逻辑基本不需要修改,可增加空值判断增强鲁棒性:
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
相关产品推荐
相关产品推荐

