我想向冻结的类中添加一个自定义转换器,就像在this answer中一样。
我用下面的代码尝试了一下:
@freezed
class NewsPost with _$NewsPost {
factory NewsPost({
@JsonKey(name: "date") @TimestampConverter() DateTime? date,
}) = _NewsPost;
factory NewsPost.fromJson(Map<String, dynamic> json) =>
_$NewsPostFromJson(json);
}但它并没有起作用。任何想法都非常受欢迎!
出于您的兴趣,这是我的Converter:
class TimestampConverter implements JsonConverter<DateTime, Timestamp> {
const TimestampConverter();
@override
DateTime fromJson(Timestamp timestamp) {
return timestamp.toDate();
}
@override
Timestamp toJson(DateTime date) => Timestamp.fromDate(date);
}谢谢:-)
发布于 2021-07-06 21:19:02
好吧,这不是最优雅的解决方案,但它是有效的。
@freezed
class NewsPost with _$NewsPost {
factory NewsPost({
@JsonKey(
name: "date",
fromJson: dateTimeFromJson,
fromJson: dateTimeToJson,
) DateTime? date,
}) = _NewsPost;
factory NewsPost.fromJson(Map<String, dynamic> json) =>
_$NewsPostFromJson(json);
}
DateTime dateTimeFromJson(Timestamp timestamp) {
return timestamp.toDate();
}
Timestamp dateTimeToJson(DateTime date) => Timestamp.fromDate(date);我认为这是一个解决方案。使用JsonConverter我不能让它工作。
发布于 2021-10-28 06:57:40
由于引入了空安全性,对于使用freezed生成器的JsonConverter,在JsonConverter中声明的类型的可空性需要与冻结的类中的类型的可空性相匹配。
如果类型不匹配,freezed将忽略转换器。
因此,使用您的示例:
@freezed
class NewsPost with _$NewsPost {
factory NewsPost({
@TimestampOrNullConverter() DateTime? date, // <-- this is nullable, so the converter needs to handle null
@TimestampConverter() DateTime createdAt, // <-- not nullable, so your exsiting converter will work
}) = _NewsPost;
factory NewsPost.fromJson(Map<String, dynamic> json) =>
_$NewsPostFromJson(json);
}
class TimestampConverter implements JsonConverter<DateTime, Timestamp> {
const TimestampConverter();
@override
DateTime fromJson(Timestamp timestamp) {
return timestamp.toDate();
}
@override
Timestamp toJson(DateTime date) => Timestamp.fromDate(date);
}
class TimestampOrNullConverter implements JsonConverter<DateTime?, Timestamp?> {
const TimestampConverter();
@override
DateTime? fromJson(Timestamp? timestamp) {
return timestamp?.toDate();
}
@override
Timestamp? toJson(DateTime? date) => date == null ? null : Timestamp.fromDate(date);
}在flutter 2.5.3上使用以下依赖项版本进行测试和工作:
dev_dependencies:
build_runner: ^2.1.4
freezed: ^0.15.0+1
json_serializable: ^5.0.2https://stackoverflow.com/questions/67150713
复制相似问题