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



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);
}
  1. 生成器不支持时间戳数据类型。
  2. 当我使用 DateTime 数据类型时,它正在生成代码,但在将 documentSnaphot 数据解析为

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

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

最好将时间戳转换为日期时间

// To parse this JSON data, do
//
//     final notificationModel = notificationModelFromJson(jsonString);
import 'dart:convert';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'notification_model.freezed.dart';
part 'notification_model.g.dart';
NotificationModel notificationModelFromJson(String str) =>
NotificationModel.fromJson(json.decode(str));
String notificationModelToJson(NotificationModel data) =>
json.encode(data.toJson());
@freezed
abstract class NotificationModel with _$NotificationModel {
const factory NotificationModel({
String? title,
String? uid,
String? description,
@JsonKey(name: 'createdOn', fromJson: _sendAtFromJson) DateTime? createdOn,
}) = _NotificationModel;
factory NotificationModel.fromJson(Map<String, dynamic> json) =>
_$NotificationModelFromJson(json);
}
DateTime _sendAtFromJson(Timestamp timestamp) =>
DateTime.fromMillisecondsSinceEpoch(timestamp.millisecondsSinceEpoch);

就我而言,仅来自 json 方法是不够的。我想使用毫秒从 epoch 从/转换为 json:

Timestamp _timestampFromJson(int timestamp) => Timestamp.fromMillisecondsSinceEpoch(timestamp);
int _timestampToJson(Timestamp timestamp) => timestamp.millisecondsSinceEpoch ;

在冻结的字段中,类型为时间戳:

@JsonKey(name: 'key_name', fromJson: _timestampFromJson , toJson: _timestampToJson)

最新更新