enum CharacterType { Survivor, Hunter } class Character { final String name; final CharacterType type; final String backstory; final String imageUrl; bool isLiked; Character({ required this.name, required this.type, required this.backstory, required this.imageUrl, this.isLiked = false, // Значение по умолчанию - false }); factory Character.fromJson(Map json) { try { CharacterType characterType; if (json['type'] == 'Выживший') { characterType = CharacterType.Survivor; } else if (json['type'] == 'Охотник') { characterType = CharacterType.Hunter; } else { throw Exception('Неизвестный тип персонажа: ${json['type']}'); } return Character( name: json['name'], type: characterType, backstory: json['backstory'], imageUrl: json['image_url'], // Используем корректный URL ); } catch (e) { print("Ошибка при парсинге данных: $e"); throw Exception('Ошибка при парсинге персонажа'); } } // Преобразуем тип обратно в строку String get typeString { switch (type) { case CharacterType.Survivor: return 'Выживший'; case CharacterType.Hunter: return 'Охотник'; default: return 'Неизвестно'; } } String getInfo() { return '$typeString - $backstory'; } // Для пустого объекта static Character? empty() { return null; // Возвращаем null для пустого объекта } } class Survivor extends Character { Survivor({ required String name, required String backstory, required String imageUrl, }) : super( name: name, backstory: backstory, imageUrl: imageUrl, type: CharacterType.Survivor, ); } class Hunter extends Character { Hunter({ required String name, required String backstory, required String imageUrl, }) : super( name: name, backstory: backstory, imageUrl: imageUrl, type: CharacterType.Hunter, ); } class CharacterDTO { final String name; final String characterType; final String backstory; final String imageUrl; bool isLiked; // Добавлено поле для состояния лайка CharacterDTO({ required this.name, required this.characterType, required this.backstory, required this.imageUrl, this.isLiked = false, // Значение по умолчанию - false }); // Метод для преобразования в DTO (можно удалить, так как он уже возвращает текущий объект) CharacterDTO toDTO() { return CharacterDTO( name: name, characterType: typeString, backstory: backstory, imageUrl: imageUrl, isLiked: isLiked, ); } // Метод fromJson для создания объекта из Map factory CharacterDTO.fromJson(Map json) { return CharacterDTO( name: json['name'], characterType: json['type'], backstory: json['backstory'], imageUrl: json['image_url'], isLiked: json['isLiked'] ?? false, // Поддержка поля isLiked ); } // Геттер для типа в строковом виде String get typeString { switch (characterType) { case 'Выживший': return 'Выживший'; case 'Охотник': return 'Охотник'; default: return 'Неизвестно'; } } // Преобразуем DTO обратно в объект Character Character toCharacter() { return Character( name: name, type: characterType == 'Выживший' ? CharacterType.Survivor : CharacterType.Hunter, backstory: backstory, imageUrl: imageUrl, isLiked: isLiked, ); } // Метод для преобразования объекта в Map Map toMap() { return { 'name': name, 'type': characterType, 'backstory': backstory, 'image_url': imageUrl, 'isLiked': isLiked, // Добавляем поле isLiked в Map }; } }