json = null в методе fromJSON в пользовательском JsonConverter «замороженный класс с несколькими конструкторами»
У меня есть этот класс
@freezed
abstract class CartEntity with _$CartEntity {
const factory CartEntity.empty(String status, String message) = _Empty;
const factory CartEntity.notEmpty(int x) = _NotEmpty;
factory CartEntity.fromJson(Map<String, dynamic> json) =>
_$CartEntityFromJson(json);
}
И этот конвертер
class CartEntityConverter
implements JsonConverter<CartEntity, Map<String, dynamic>> {
const CartEntityConverter();
@override
CartEntity fromJson(Map<String, dynamic> json) {
//the problem here
print(json);// null
return _Empty.fromJson(json);
}
@override
Map<String, dynamic> toJson(CartEntity object) {
return object.toJson();
}
}
И этот класс-оболочка
@freezed
abstract class CartEntityWrapper with _$CartEntityWrapper {
const factory CartEntityWrapper(@CartEntityConverter() CartEntity cartEntity) =
CartEntityWrapperData;
factory CartEntityWrapper.fromJson(Map<String, dynamic> json) =>
_$CartEntityWrapperFromJson(json);
}
И я позвонил
final cartEntity = CartEntityWrapperData.fromJson({'x':'y'});
print(cartEntity);
fromJson, который в CartEntityConverter всегда получает нулевой json, так что я сделал не так?
2 ответа
Вместо того, чтобы создавать еще один класс конвертера, который вы используете напрямую, вы можете просто добавить
.fromJsonA
метод в основном классе.
Это будет выглядеть так:
@freezed
abstract class CartEntity with _$CartEntity {
const factory CartEntity.empty(String status, String message) = _Empty;
const factory CartEntity.notEmpty(int x) = _NotEmpty;
factory CartEntity.fromJson(Map<String, dynamic> json) =>
_$CartEntityFromJson(json);
factory CartEntity.fromJsonA(Map<String, dynamic> json) {
if (/*condition for .empty constructor*/) {
return _Empty.fromJson(json);
} else if (/*condition for .notEmpty constructor*/) {
return _NotEmpty.fromJson(json);
} else {
throw Exception('Could not determine the constructor for mapping from JSON');
}
}
}
решено с помощью
final cartEntity = CartEntityConverter().fromJson({'x':'y'});
print(cartEntity);
вместо
final cartEntity = CartEntityWrapperData.fromJson({'x':'y'});
print(cartEntity);
документации на данный момент не хватает, я пробовал случайные вещи, чтобы заставить ее работать