如何在firebase(Flutter/dart)中添加具有DocumentReference类型的对象?

问题描述 投票:0回答:2

我想在 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) =>
          文档参考;
    }

json firebase flutter dart google-cloud-firestore
2个回答
2
投票

我能够从网上找到的研究中整理出我的解决方案,到目前为止已经想出了这个。

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;
}

0
投票

我一直在调查,发现存在与某些版本的分析器包相关的“问题”。我将其留在这里,以防它对社区中的某人有用(如果您使用“0.39.15”或“0.39.16”版本,这可能是原因)。如果是这种情况,您现在可以在 pubspec.yaml 中设置覆盖: dependency_overrides: analyzer: '0.39.14'

此外,您应该在以下时间后清除所有缓存:

flutter clean flutter pub cache repair flutter pub run build_runner clean

© www.soinside.com 2019 - 2024. All rights reserved.