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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:30:02