Flutter使用freezed嵌套模型上传Firestore报_$_Category实例错误
问题根因
该报错是因为Firestore仅支持基础数据类型(字符串、数字、布尔、Map、List、null等)的写入,你当前的categories字段列表里存储的是未序列化的_$_Category实例,Firestore无法识别该实例类型导致写入失败。
你虽然已经在build.yaml中开启了explicit_to_json: true,但配置没有生效,大概率是旧的生成代码缓存未清理导致的。
解决方案
按顺序执行以下操作即可解决:
- 清理旧的生成缓存,重新生成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(),如果是则说明序列化逻辑已经正确生成。
- 兜底手动处理(可选,适用于临时验证场景)
如果不想重新生成代码,可以直接修改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
相关产品推荐
相关产品推荐

