генерик объекты?
                  
                  
                  
                  
                  
                  Набросал небольшой пример, но мне очень не нравится обилие букв и корявость происходящего
                  
                  
                  
                  
                  
                  Ну или если это фигня на ваш взгляд, как бы вы разбирали какой-нибудь Paged Response?
                  
                  
                  ___
                  
                  
                  
                  
                  
                  void main() {
                  
                  
                    final process1 = '{"id":"123", "type":"Variant1", "data":{"something":"kek1"}}';
                  
                  
                    final process2 = '{"id":"123", "type":"Variant2", "data":{"another":"kek2"}}';
                  
                  
                  
                  
                  
                    final decoded1 = jsonDecode(process1) as Map<String, dynamic>;
                  
                  
                    final decoded2 = jsonDecode(process2) as Map<String, dynamic>;
                  
                  
                  
                  
                  
                    print("parsed");
                  
                  
                  
                  
                  
                    final result1 = DataVariant1Proces.fromJson(decoded1, ProcesType.Variant1);
                  
                  
                    final result2 = DataVariant2Proces.fromJson(decoded2, ProcesType.Variant2);
                  
                  
                  
                  
                  
                    print("created");
                  
                  
                  
                  
                  
                    print("serialized back\n$result1\n$result2");
                  
                  
                  }
                  
                  
                  ___
                  
                  
                  
                  
                  
                  import 'package:json_annotation/json_annotation.dart';
                  
                  
                  
                  
                  
                  part 'generic_process_demo.g.dart';
                  
                  
                  
                  
                  
                  enum ProcesType { Variant1, Variant2 }
                  
                  
                  
                  
                  
                  typedef DataVariant1Proces = Proces<DataVariant1>;
                  
                  
                  typedef DataVariant2Proces = Proces<DataVariant2>;
                  
                  
                  
                  
                  
                  @JsonSerializable()
                  
                  
                  class DataVariant1 {
                  
                  
                    DataVariant1({required this.something});
                  
                  
                    factory DataVariant1.fromJson(Map<String, dynamic> json) => _$DataVariant1FromJson(json);
                  
                  
                  
                  
                  
                    Map<String, dynamic> toJson() => _$DataVariant1ToJson(this);
                  
                  
                  
                  
                  
                    final String something;
                  
                  
                  
                  
                  
                    @override
                  
                  
                    String toString() => toJson().toString();
                  
                  
                  }
                  
                  
                  
                  
                  
                  @JsonSerializable()
                  
                  
                  class DataVariant2 {
                  
                  
                    DataVariant2({required this.another});
                  
                  
                    factory DataVariant2.fromJson(Map<String, dynamic> json) => _$DataVariant2FromJson(json);
                  
                  
                  
                  
                  
                    Map<String, dynamic> toJson() => _$DataVariant2ToJson(this);
                  
                  
                  
                  
                  
                    final String another;
                  
                  
                  
                  
                  
                    @override
                  
                  
                    String toString() => toJson().toString();
                  
                  
                  }
                  
                  
                  
                  
                  
                  @JsonSerializable(genericArgumentFactories: true)
                  
                  
                  class Proces<T> {
                  
                  
                    Proces({required this.id, required this.data, required this.type});
                  
                  
                  
                  
                  
                    factory Proces.fromJson(Map<String, dynamic> json, ProcesType type) {
                  
                  
                      switch (type) {
                  
                  
                        case ProcesType.Variant1:
                  
                  
                          return _$ProcesFromJson(json, (Object? o) => _$DataVariant1FromJson(o as Map<String, dynamic>) as T);
                  
                  
                        case ProcesType.Variant2:
                  
                  
                          return _$ProcesFromJson(json, (Object? o) => _$DataVariant2FromJson(o as Map<String, dynamic>) as T);
                  
                  
                      }
                  
                  
                    }
                  
                  
                  
                  
                  
                    Map<String, dynamic> toJson() {
                  
                  
                      switch (type) {
                  
                  
                        case ProcesType.Variant1:
                  
                  
                          return _$ProcesToJson<DataVariant1>(this as Proces<DataVariant1>, _$DataVariant1ToJson);
                  
                  
                        case ProcesType.Variant2:
                  
                  
                          return _$ProcesToJson<DataVariant2>(this as Proces<DataVariant2>, _$DataVariant2ToJson);
                  
                  
                      }
                  
                  
                    }
                  
                  
                  
                  
                  
                    final String id;
                  
                  
                    final ProcesType type;
                  
                  
                    final T data;
                  
                  
                  
                  
                  
                    @override
                  
                  
                    String toString() => toJson().toString();
                  
                  
                  }
                  
                  
                
Первое и главное Не постить такую колбасу в чат!
Ок, сейчас уберу в аттач
Посмотрите в сторону freezed: https://pub.dev/packages/freezed#fromjson---classes-with-multiple-constructors
Спасибо, выглядит очень прикольно Остался один нюанс - можно ли от чего-то унаследовать кейсы в юнионе? Например у меня все они одинаковые, но отличаются одним только полем data И писать целиком конструктор для каждого из них не очень удобно
Если type используется только для определения варианта при десериализации, то его в конструкторе можно и не задавать. А остальные поля придется писать, скорее всего.
Обсуждают сегодня