Flutter 如何将具有时间戳字段的firestore文档数据转换为通过冻结dart包生成的数据类?

Flutter 如何将具有时间戳字段的firestore文档数据转换为通过冻结dart包生成的数据类?,flutter,dart,Flutter,Dart,我的Dto的结构如下所示- @freezed abstract class MessageDto with _$MessageDto{ factory MessageDto({ String message, @JsonKey(name: 'message_type') String messageType, @JsonKey(name: 'sender_id') String senderId, @JsonKey(name: 'sent_at') Times

我的Dto的结构如下所示-

@freezed
abstract class MessageDto with _$MessageDto{
  factory MessageDto({
    String message,
    @JsonKey(name: 'message_type') String messageType,
    @JsonKey(name: 'sender_id') String senderId,
    @JsonKey(name: 'sent_at') Timestamp sendAt,
    }) = _MessageDto;

  factory MessageDto.fromFirestore(DocumentSnapshot doc) {
    Map<String, dynamic> json = doc.data;
    return MessageDto.fromJson(json);
  }
  factory MessageDto.fromJson(Map<String, dynamic> json) => _$MessageDtoFromJson(json);
}

@冻结
带有$MessageDto的抽象类MessageDto{
工厂信息({
字符串消息,
@JsonKey(名称:“消息类型”)字符串消息类型,
@JsonKey(名称:'sender_id')字符串senderId,
@JsonKey(名称:'sent_at')时间戳sendAt,
})=_MessageDto;
工厂消息发送至FireStore(文档快照文档){
Map json=doc.data;
返回MessageDto.fromJson(json);
}
工厂MessageDto.fromJson(映射json)=>\u$MessageDtoFromJson(json);
}
  • 生成器不支持时间戳数据类型
  • 当我使用DateTime数据类型时,它会生成代码,但会在解析documentSnaphot数据时引发异常
  • 未处理的异常:类型“Timestamp”不是类型转换中类型“String”的子类型


    您可以将自定义的
    fromJson
    toJson
    函数传递给
    @JsonKey

    Timestamp\u sendAtFromJson(Timestamp Timestamp)=>Timestamp;
    @冻结
    带有$MessageDto的抽象类MessageDto{
    工厂信息({
    字符串消息,
    @JsonKey(名称:“消息类型”)字符串消息类型,
    @JsonKey(名称:'sender_id')字符串senderId,
    @JsonKey(名称:'send_at',fromJson:_sendAtFromJson)时间戳sendAt,
    })=_MessageDto;
    工厂消息发送至FireStore(文档快照文档){
    Map json=doc.data;
    返回MessageDto.fromJson(json);
    }
    工厂MessageDto.fromJson(映射json)=>\u$MessageDtoFromJson(json);
    }
    
    您找到解决方案了吗?有同样的问题,正在寻找解决方案。找到了解决方案,请参阅下面的答案。我正在从另一个线程交叉发布。。。见:
    Timestamp _sendAtFromJson(Timestamp timestamp) => timestamp;
    
    @freezed
    abstract class MessageDto with _$MessageDto{
      factory MessageDto({
        String message,
        @JsonKey(name: 'message_type') String messageType,
        @JsonKey(name: 'sender_id') String senderId,
        @JsonKey(name: 'sent_at', fromJson: _sendAtFromJson) Timestamp sendAt,
        }) = _MessageDto;
    
      factory MessageDto.fromFirestore(DocumentSnapshot doc) {
        Map<String, dynamic> json = doc.data;
        return MessageDto.fromJson(json);
      }
      factory MessageDto.fromJson(Map<String, dynamic> json) => _$MessageDtoFromJson(json);
    }