如何将具有时间戳字段的firestore doc数据转换为通过Freezed dart包生成的数据类?

Man*_*wal 6 dart flutter

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

Run Code Online (Sandbox Code Playgroud)
  1. 生成器不支持时间戳数据类型。
  2. 当我使用 DateTime dataType 时,它​​正在生成代码,但在解析 documentSnaphot 数据时抛出异常

未处理的异常:类型“Timestamp”不是类型转换中类型“String”的子类型

Isa*_*sak 5

您可以将自定义fromJsontoJson函数传递给@JsonKey. https://pub.dev/documentation/json_annotation/latest/json_annotation/JsonKey/JsonKey.html

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);
}
Run Code Online (Sandbox Code Playgroud)