Flutter中Map转JSON字符串存入sqflite报NoSuchMethodError问题咨询
问题解决方法
错误根源
- Dart 内置的
jsonEncode/json.encode仅支持序列化key为String类型的Map,你当前variants的结构为Map<String, Map<int, String>>,内层Map的key为int类型,不符合JSON序列化要求,因此抛出NoSuchMethodError,同时输出结果不会自动添加双引号。 - 不需要额外引入
json_serializable处理这个场景,手动转换类型即可,避免依赖版本冲突。
解决步骤
方案1:在Cart类的toJson方法中统一转换(推荐,不影响原有业务逻辑)
修改Cart类的toJson逻辑,遍历转换内层Map的int类型key为String类型,修改后代码如下:
import 'dart:convert'; class Cart { String idItem; String title; Map<String, dynamic> variants; List<String> images; Cart({this.idItem, this.title, this.variants, this.images}); Map<String, dynamic> toJson() => <String, dynamic>{ 'idItem': this.idItem, 'title': this.title, // 转换内层Map的int key为String后再序列化 'variants': jsonEncode( this.variants.map((modelKey, innerMap) { final convertedInner = innerMap.map((intKey, value) => MapEntry(intKey.toString(), value)); return MapEntry(modelKey, convertedInner); }), ), 'images': jsonEncode(this.images), }; }
方案2:构造resultMap时直接使用String类型key
你也可以在生成resultMap的阶段就把内层key转为String,后续无需额外处理:
修改addToCart函数中values的定义与赋值逻辑:
// 把原来的Map<int, String> values = Map(); 改为 Map<String, String> values = Map(); // 把原来的values[ind + 1] = reasultC; 改为 values[(ind + 1).toString()] = reasultC;
修改后Cart类的toJson方法可以直接使用jsonEncode(this.variants),无需额外转换。
读取数据说明
从sqflite读取variants字段时,调用jsonDecode即可得到Map<String, Map<String, String>>类型的结构,如果你需要转回int类型的key,遍历处理即可。
内容的提问来源于stack exchange,提问作者Vasya2014
相关产品推荐
相关产品推荐

