Определить несколько классов в fromJson Flutter
У меня имеется класс HomeItem, который содержит какой-то другой класс. Проблема в том, что мне нужно определить какой класс вложен в данный класс. Как мне записать json['child'], чтобы можно дальше определить с помощью enum(HomeType)?
class HomeItem {
String name;
dynamic child;
bool isLink;
bool isLocked;
bool isPinned;
bool isAnimated;
bool isDublicated;
ItemLocation location;
HomeItem({
this.name = '',
required this.child,
this.isLink = false,
this.isLocked = false,
this.isPinned = false,
this.isAnimated = false,
this.isDublicated = false,
required this.location,
});
void pin() {
isPinned = !isPinned;
}
void animate() {
isAnimated = !isAnimated;
}
HomeItem.fromJson(Map<String, dynamic> json)
: name = json['name'] ?? '',
// если сделать так, то все работает:
// child = StorageFile.fromJson(json['child']),
// а нужно, чтобы работало для всех:
child = json['child'].values.map((e) {
switch (HomeType.values.elementAt(e['type'])) {
case HomeType.chat:
return Chat.fromJson(e);
case HomeType.storageFile:
return StorageFile.fromJson(e);
case HomeType.todo:
return Todo.fromJson(e);
case HomeType.audioNote:
return AudioNote.fromJson(e);
default:
}
}),
isLink = json['isLink'] ?? false,
isLocked = json['isLocked'] ?? false,
isPinned = json['isPinned'] ?? false,
isAnimated = json['isAnimated'] ?? false,
isDublicated = json['isDublicated'] ?? false,
location = ItemLocation.fromJson(json['location']);
Map<String, dynamic> toJson() => {
'name': name,
'child': child.toJson(),
'isLink': isLink,
'isLocked': isLocked,
'isPinned': isPinned,
'isAnimated': isAnimated,
'isDublicated': isDublicated,
'location': location.toJson()
};
}
Ответы (1 шт):
Автор решения: Nikondrat
→ Ссылка
Мне с этим помогли на Stack Overflow, это работает:
class HomeItem {
String name;
dynamic child;
HomeItem({
this.name = '',
required this.child,
});
HomeItem.fromJson(Map<String, dynamic> json)
: name = json['name'] ?? '',
child = _childFromJson(json['child']);
static dynamic _childFromJson(Map<String, dynamic> json) {
switch (HomeType.values.elementAt(json['type'])) {
case HomeType.chat:
return Chat.fromJson(json);
case HomeType.storageFile:
return StorageFile.fromJson(json);
case HomeType.todo:
return Todo.fromJson(json);
case HomeType.audioNote:
return AudioNote.fromJson(json);
default:
}
}
}