5

我想将自定义转换器添加到这个答案中的冻结类。

我用这段代码试了一下:

@freezed
class NewsPost with _$NewsPost {
  factory NewsPost({
    @JsonKey(name: "date") @TimestampConverter() DateTime? date,
  }) = _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);
}

谢谢 :-)

4

2 回答 2

1

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

@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-07-06T13:19:01.633 回答
1

由于引入了空安全性,为了JsonConverterfreezed生成器一起工作,需要声明的类型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.2
于 2021-10-28T06:57:39.983 回答