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