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);

документации на данный момент не хватает, я пробовал случайные вещи, чтобы заставить ее работать

Другие вопросы по тегам