如何将具有时间戳字段的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】:您可以将自定义fromJson
和toJson
函数传递给@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 中重复使用现有字段作为分片时间戳吗?
如何从 Flutter 将文档创建时间戳添加到 Firestore [重复]
如何使用 Android 在 Firestore 中添加时间戳?