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

Posted

技术标签:

【中文标题】如何将具有时间戳字段的firestore doc数据转换为通过Freezed dart包生成的数据类?【英文标题】:How to convert firestore doc data having timestamp field into the data class generated through Freezed dart package? 【发布时间】:2020-09-27 21:47:03 【问题描述】:

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


    生成器不支持 TimeStamp 数据类型。 当我使用 DateTime 数据类型时,它正在生成代码,但在将 documentSnaphot 数据解析为时抛出异常

未处理的异常:类型“时间戳”不是类型转换中“字符串”类型的子类型

【问题讨论】:

您找到解决方案了吗?遇到同样的问题并寻找解决方案。 找到了解决办法,请看下面的答案。 我正在从另一个线程交叉发布...请参阅:***.com/a/67962150/7183998 【参考方案1】:

您可以将自定义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);

【讨论】:

以上是关于如何将具有时间戳字段的firestore doc数据转换为通过Freezed dart包生成的数据类?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 Firestore 中重复使用现有字段作为分片时间戳吗?

React - 显示 Firestore 时间戳

如何从 Flutter 将文档创建时间戳添加到 Firestore [重复]

如何使用 Android 在 Firestore 中添加时间戳?

如何在 Vue 3 项目中显示使用 date-fns 格式的 Firestore 时间戳字段?

React Native Parse Firestore 时间戳