首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Freezed和json_serializable:如何使用自定义转换器

Freezed和json_serializable:如何使用自定义转换器
EN

Stack Overflow用户
提问于 2021-04-19 00:12:37
回答 2查看 1K关注 0票数 4

我想向冻结的类中添加一个自定义转换器,就像在this answer中一样。

我用下面的代码尝试了一下:

代码语言:javascript
复制
@freezed
class NewsPost with _$NewsPost {
  factory NewsPost({
    @JsonKey(name: "date") @TimestampConverter() DateTime? date,
  }) = _NewsPost;

  factory NewsPost.fromJson(Map<String, dynamic> json) =>
      _$NewsPostFromJson(json);
}

但它并没有起作用。任何想法都非常受欢迎!

出于您的兴趣,这是我的Converter:

代码语言:javascript
复制
class TimestampConverter implements JsonConverter<DateTime, Timestamp> {
  const TimestampConverter();

  @override
  DateTime fromJson(Timestamp timestamp) {
    return timestamp.toDate();
  }

  @override
  Timestamp toJson(DateTime date) => Timestamp.fromDate(date);
}

谢谢:-)

EN

回答 2

Stack Overflow用户

发布于 2021-07-06 21:19:02

好吧,这不是最优雅的解决方案,但它是有效的。

代码语言:javascript
复制
@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我不能让它工作。

票数 1
EN

Stack Overflow用户

发布于 2021-10-28 06:57:40

由于引入了空安全性,对于使用freezed生成器的JsonConverter,在JsonConverter中声明的类型的可空性需要与冻结的类中的类型的可空性相匹配。

如果类型不匹配,freezed将忽略转换器。

因此,使用您的示例:

代码语言:javascript
复制
@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上使用以下依赖项版本进行测试和工作:

代码语言:javascript
复制
dev_dependencies:
  build_runner: ^2.1.4
  freezed: ^0.15.0+1
  json_serializable: ^5.0.2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67150713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档