Flutter安全存储存储对象值报错:NoSuchMethodError问题求助
解决Flutter中NoSuchMethodError: '_Map<String, dynamic>'无toJson方法的问题
错误原因
报错的核心是jsonResponse['data'][0]本身是Map<String, dynamic>类型的原生集合对象,并非你自定义的、实现了toJson()方法的模型类,所以直接调用.toJson()会触发方法不存在的错误。
解决方案
分两种场景处理:
场景1:直接存储Map数据
如果不需要用模型类封装数据,直接对现有Map做序列化即可——json.encode()本身支持直接处理Map,无需额外调用toJson():
await LocalStorage().addStorage('currentUser', json.encode(jsonResponse['data'][0]));
场景2:转为自定义模型类后存储
如果希望用模型类管理用户数据,先定义带序列化方法的模型类,再完成转换存储:
- 定义User模型类(示例):
class User { final String id; final String username; // 根据接口返回补充其他字段 User({required this.id, required this.username}); // 从Map转模型对象 factory User.fromJson(Map<String, dynamic> json) { return User( id: json['id'], username: json['username'], ); } // 模型转Map(实现toJson方法) Map<String, dynamic> toJson() { return { 'id': id, 'username': username, }; } }
- 转换并存储:
User user = User.fromJson(jsonResponse['data'][0]); await LocalStorage().addStorage('currentUser', json.encode(user.toJson()));
安全存储补充说明
- Flutter安全存储(如flutter_secure_storage)仅支持存储字符串,所以必须通过
json.encode()将对象/Map转为JSON字符串后存入。 - 读取数据时,需要用
json.decode()将字符串转回Map或模型对象:
String? userStr = await LocalStorage().getStorage('currentUser'); if (userStr != null) { // 转回Map Map<String, dynamic> userMap = json.decode(userStr); // 或转回模型 User user = User.fromJson(userMap); }
内容的提问来源于stack exchange,提问作者Tantely José
相关产品推荐
相关产品推荐

