0

我正在使用freezed包来处理不可变模型,并利用json_serializable包的内置功能进行 json 序列化。我有一个User具有不同联合类型(、、、)的简单类UserLoggedIn/UserGeneral模型UserError

@freezed
class User with _$User {
  const factory User(String id, String email, String displayName) =
      UserLoggedIn;
  const factory User.general(String email, String displayName) = UserGeneral;
  const factory User.error(String message) = UserError;

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

由于我使用多个构造函数并且不希望我的 API 包含runtimeType文档建议的密钥,因此我可以编写一个转换器(向下滚动一点,句子开头为:如果您不控制 JSON 响应,那么你可以实现一个自定义转换器。)。

因此,基于此,我编写了以下转换器类:

class UserConverter implements JsonConverter<User, Map<String, dynamic>> {
  const UserConverter();

  @override
  User fromJson(Map<String, dynamic> json) {
    if (json['id'] != null) {
      return UserLoggedIn.fromJson(json);
    } else if (json['error'] != null) {
      return UserError.fromJson(json);
    } else {
      return UserGeneral.fromJson(json);
    }
  }

  @override
  Map<String, dynamic> toJson(User data) => data.toJson();
}

该文档现在引用了另一个类(包装类),该类现在将通过注释使用此转换器,如下所示:

@freezed
class UserModel with _$UserModel {
  const factory UserModel(@UserConverter() User user) = UserModelData;

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

问题:是否可以在使用包装类(UserModel)的情况下使用此转换器?

推理:这个包装类正在添加另一个不需要的抽象层(在我的情况下)。特别是因为包装类没有任何其他好处/目的,并且感觉应该可以在不使用它的情况下做到这一点。

4

0 回答 0