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

Flutter使用freezed嵌套模型上传Firestore报_$_Category实例错误

问题根因

该报错是因为Firestore仅支持基础数据类型(字符串、数字、布尔、Map、List、null等)的写入,你当前的categories字段列表里存储的是未序列化的_$_Category实例,Firestore无法识别该实例类型导致写入失败。
你虽然已经在build.yaml中开启了explicit_to_json: true,但配置没有生效,大概率是旧的生成代码缓存未清理导致的。


解决方案

按顺序执行以下操作即可解决:

  1. 清理旧的生成缓存,重新生成freezed代码
    改完build.yaml配置后必须清理缓存重新生成代码,配置才会生效,在项目根目录执行以下命令:
flutter pub run build_runner clean
flutter pub run build_runner build --delete-conflicting-outputs

生成完成后可以打开product.freezed.dart/product.g.dart文件,检查Product类的toJson方法中,categories字段的处理逻辑是否为categories.map((e) => e.toJson()).toList(),如果是则说明序列化逻辑已经正确生成。

  1. 兜底手动处理(可选,适用于临时验证场景)
    如果不想重新生成代码,可以直接修改Firestore的withConverter配置,手动序列化categories字段:
CollectionReference<Product> products() {
  const path = FirebasePaths.products;
  return _firestore.collection(path).withConverter<Product>(
        fromFirestore: (snapshot, options) => Product.fromJson(
          snapshot.data() ?? const {},
        ),
        toFirestore: (value, options) {
          final json = value.toJson();
          // 手动序列化嵌套的Category列表
          json['categories'] = value.categories.map((e) => e.toJson()).toList();
          return json;
        },
      );
}

额外注意事项

你代码中soldQuantity、createdAt、updatedAt声明为dynamic类型,如果实际使用时是自定义类型,也需要做对应的序列化处理,否则也会触发同类报错。

内容的提问来源于stack exchange,提问作者Usama Karim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:54:07