Val*_*sen 33 flutter json-serializable freezed
我想将自定义转换器添加到冻结的类中,就像这个答案一样。
我用这段代码尝试过:
@freezed
class NewsPost with _$NewsPost {
factory NewsPost({
@JsonKey(name: "date") @TimestampConverter() DateTime? date,
}) = _NewsPost;
factory NewsPost.fromJson(Map<String, dynamic> json) =>
_$NewsPostFromJson(json);
}
Run Code Online (Sandbox Code Playgroud)
但这没有用。任何想法都非常受欢迎!
为了您的兴趣,这是我的转换器:
class TimestampConverter implements JsonConverter<DateTime, Timestamp> {
const TimestampConverter();
@override
DateTime fromJson(Timestamp timestamp) {
return timestamp.toDate();
}
@override
Timestamp toJson(DateTime date) => Timestamp.fromDate(date);
}
Run Code Online (Sandbox Code Playgroud)
谢谢 :-)
Bul*_*kel 36
由于引入了 null 安全性,为了JsonConverter与生成器一起使用, freezed需要声明的类型的可为空性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 TimestampOrNullConverter();
@override
DateTime? fromJson(Timestamp? timestamp) {
return timestamp?.toDate();
}
@override
Timestamp? toJson(DateTime? date) => date == null ? null : Timestamp.fromDate(date);
}
Run Code Online (Sandbox Code Playgroud)
使用以下依赖版本在 flutter 2.5.3 上进行了测试和工作:
dev_dependencies:
build_runner: ^2.1.4
freezed: ^0.15.0+1
json_serializable: ^5.0.2
Run Code Online (Sandbox Code Playgroud)
小智 13
好吧,它\xc2\xb4s 不是最优雅的解决方案,但它确实有效。
\n@freezed\nclass NewsPost with _$NewsPost {\n factory NewsPost({\n @JsonKey(\n name: "date", \n fromJson: dateTimeFromJson, \n toJson: dateTimeToJson,\n ) DateTime? date,\n }) = _NewsPost;\n\n factory NewsPost.fromJson(Map<String, dynamic> json) =>\n _$NewsPostFromJson(json);\n}\n\n\nDateTime dateTimeFromJson(Timestamp timestamp) {\n return timestamp.toDate();\n}\n\nTimestamp dateTimeToJson(DateTime date) => Timestamp.fromDate(date);\nRun Code Online (Sandbox Code Playgroud)\n我认为\xc2\xb4是一个解决方案。使用 JsonConverter 我无法让它工作。
\n| 归档时间: |
|
| 查看次数: |
20344 次 |
| 最近记录: |