Определить несколько классов в 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:
    }
  }
}
→ Ссылка