我想在 firebase 的帖子文档中引用类别文档。 这是我的数据类,我也使用 freezed 和 json_serializer:
'post_dto.freezed.dart' 部分; 'post_dto.g.dart' 部分; 'category_dto.freezed.dart' 部分; 'category_dto.g.dart' 部分; @冻结 带有 _$PostDTO 的抽象类 PostDTO { const PostDTO._(); 常量工厂 PostDTO({ @JsonKey(ignore: true) 字符串? ID, 必需的字符串标题, 必需的字符串描述, @DocumentReferenceConveter() 文档参考?类别参考, }) = _PostDTO; 工厂 PostDTO.fromJson(Map json) => _$PostDTOFromJson(json); 工厂 PostDTO.fromFireStore(DocumentSnapshot 文档) { 地图数据 = document.data() as Map; return PostDTO.fromJson(data).copyWith(id: document.id); } } @冻结 带有 _$CategoryDTO 的抽象类 CategoryDTO { const CategoryDTO._(); const 工厂 CategoryDTO({ 必需的字符串图标, 必需的字符串名称, }) = _CategoryDTO; 工厂 CategoryDTO.fromFireStore(DocumentSnapshot 文档) { 地图数据 = document.data() as Map; 返回 CategoryDTO.fromJson(data); } 工厂 CategoryDTO.fromJson(Map json) => _$CategoryDTOFromJson(json); }
当我运行 build_runner 时,出现此错误:
[严重] lib/infrastruct/post/post_dto.dart 上的 json_serialized:json_serialized: 无法为“categoryReference”生成“fromJson”代码。 要支持“DocumentReference”类型,您可以: * 使用`JsonConverter` https://pub.dev/documentation/json_annotation/latest/json_annotation/JsonConverter-class.html * 使用`JsonKey`字段`fromJson`和`toJson` https://pub.dev/documentation/json_annotation/latest/json_annotation/JsonKey/fromJson.html https://pub.dev/documentation/json_annotation/latest/json_annotation/JsonKey/toJson.html 包:UPLFY/infrastruction/post/post_dto.freezed.dart:373:41 ╷ 第373章 │ 最终文档参考?类别参考; │ ^^^^^^^^^^^^^^^^^^ ╵ [INFO] 运行构建完成,耗时 2.5 秒 [信息] 缓存最终确定的依赖关系图... [INFO] 缓存最终依赖图已完成,耗时 44 毫秒 [严重] 2.5 秒后失败
因此尝试使用 JsonConverter 但我不确定如何将 json 对象转换为 DocumentReference...
类 DocumentReferenceConveter 实现 JsonConverter,对象> { const DocumentReferenceConveter(); @覆盖 DocumentReference fromJson(Object json) { return //TODO: 将 json 转换为 DocumentReference } @覆盖 对象 toJson(DocumentReference documentReference) => 文档参考; }
我能够从网上找到的研究中整理出我的解决方案,到目前为止已经想出了这个。
class DocumentReferenceJsonConverter
implements JsonConverter<DocumentReference?, Object?> {
const DocumentReferenceJsonConverter();
@override
DocumentReference? fromJson(Object? json) {
// It should work if you just cast it
return json as DocumentReference;
}
@override
Object? toJson(DocumentReference? documentReference) => documentReference;
}