VB10 / flutter-architecture-template

Flutter Architecture Complete App
https://vb10.dev/#/
Apache License 2.0
650 stars 130 forks source link

json_serializable nested object object.fromJson() #1

Closed furkanvatandas closed 4 years ago

furkanvatandas commented 4 years ago

Nested objeleri json_serializable paketi ile generate ettiğimiz zaman alt nesneyi "object.fromJson()" ile alıyor bu da base_model de tanımladığımız "object fromJson()" metoduna uymuyor.

Örnek olarak: Sku nesnesindeki Price objesini generate ederken Price.fromJson()

@JsonSerializable()
class Sku implements BaseModel<Sku> {
  int id;
  int stock;
  String attributesNames;
  String title;
  Price price; // <-----

  Sku({this.id, this.stock, this.attributesNames, this.title, this.price});

  @override
  Sku fromJson(Map<String, dynamic> json) => _$SkuFromJson(json);

  @override
  Map<String, dynamic> toJson() => _$SkuToJson(this);
}
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************

Sku _$SkuFromJson(Map<String, dynamic> json) {
  return Sku(
    id: json['id'] as int,
    stock: json['stock'] as int,
    attributesNames: json['attributesNames'] as String,
    title: json['title'] as String,
    price: json['price'] == null
        ? null
        : Price.fromJson(json['price'] as Map<String, dynamic>), // <----- Bulunamayan metod
  );
}

Map<String, dynamic> _$SkuToJson(Sku instance) => <String, dynamic>{
      'id': instance.id,
      'stock': instance.stock,
      'attributesNames': instance.attributesNames,
      'title': instance.title,
      'price': instance.price,
    };
@JsonSerializable()
class Price implements BaseModel<Price> {
  double cardinal;
  final String currency;

  Price({this.cardinal, this.currency});

  @override
  Price fromJson(Map<String, dynamic> json) => _$PriceFromJson(json);

  @override
  Map<String, dynamic> toJson() => _$PriceToJson(this);

  String toTLPrice() {
    return this.cardinal.toStringAsFixed(2) + ' ' + this.currency;
  }
}

BaseModelden overide ettiğimiz "fromJson()" metodu ile birlikte paketin serializa edebilmesi için "factory Price.fromJson()" da eklemek gerekiyor galiba BaseModel kullanma işi burada patlıyor

VB10 commented 4 years ago

burada factory olarak tanimlamak nestedda gerekiyor ama sey biz basemodel yaparak herkesin ortak bir yerde olmasini sagliyoruz gerisi ic icelerde json paketinden oturu hata geliyor olabilir ama factory olarak onu ekleyip yine ayni sekilde basemodeldeki fromjsonu call edersek sorun bitiyor.