генерик объекты?
Набросал небольшой пример, но мне очень не нравится обилие букв и корявость происходящего
Ну или если это фигня на ваш взгляд, как бы вы разбирали какой-нибудь 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 используется только для определения варианта при десериализации, то его в конструкторе можно и не задавать. А остальные поля придется писать, скорее всего.
Обсуждают сегодня