ура, всё готово!!

This commit is contained in:
mirain 2024-12-17 13:46:59 +03:00
parent 223eceb238
commit a3cf2f9282
7 changed files with 94 additions and 17 deletions

View File

@ -4,5 +4,7 @@
"changeLanguage": "English", "changeLanguage": "English",
"errorMessage": "{message}", "errorMessage": "{message}",
"noData": "No data", "noData": "No data",
"characterTitle": "Character: {name}" "characterTitle": "Character: {name}",
"likeMessage": "Liked {characterName}!",
"unlikeMessage": "{characterName} unliked!"
} }

View File

@ -4,5 +4,7 @@
"changeLanguage": "Русский", "changeLanguage": "Русский",
"errorMessage": "{message}", "errorMessage": "{message}",
"noData": "Нет данных", "noData": "Нет данных",
"characterTitle": "Персонаж: {name}" "characterTitle": "Персонаж: {name}",
"likeMessage": "Понравился {characterName}!",
"unlikeMessage": "{characterName} больше не нравится!"
} }

View File

@ -130,6 +130,18 @@ abstract class AppLocale {
/// In ru, this message translates to: /// In ru, this message translates to:
/// **'Персонаж: {name}'** /// **'Персонаж: {name}'**
String characterTitle(Object name); String characterTitle(Object name);
/// No description provided for @likeMessage.
///
/// In ru, this message translates to:
/// **'Понравился {characterName}!'**
String likeMessage(Object characterName);
/// No description provided for @unlikeMessage.
///
/// In ru, this message translates to:
/// **'{characterName} больше не нравится!'**
String unlikeMessage(Object characterName);
} }
class _AppLocaleDelegate extends LocalizationsDelegate<AppLocale> { class _AppLocaleDelegate extends LocalizationsDelegate<AppLocale> {

View File

@ -27,4 +27,14 @@ class AppLocaleEn extends AppLocale {
String characterTitle(Object name) { String characterTitle(Object name) {
return 'Character: $name'; return 'Character: $name';
} }
@override
String likeMessage(Object characterName) {
return 'Liked $characterName!';
}
@override
String unlikeMessage(Object characterName) {
return '$characterName unliked!';
}
} }

View File

@ -27,4 +27,14 @@ class AppLocaleRu extends AppLocale {
String characterTitle(Object name) { String characterTitle(Object name) {
return 'Персонаж: $name'; return 'Персонаж: $name';
} }
@override
String likeMessage(Object characterName) {
return 'Понравился $characterName!';
}
@override
String unlikeMessage(Object characterName) {
return '$characterName больше не нравится!';
}
} }

View File

@ -102,6 +102,13 @@ class MyHomePage extends StatelessWidget {
onLanguageChanged(newLocale); onLanguageChanged(newLocale);
}, },
), ),
IconButton(
icon: const Icon(Icons.refresh),
onPressed: () {
// Отправляем событие для обновления данных
context.read<HomeBloc>().add(HomeLoadDataEvent());
},
),
IconButton( IconButton(
icon: const Icon(Icons.search), icon: const Icon(Icons.search),
onPressed: () { onPressed: () {
@ -127,6 +134,8 @@ class MyHomePage extends StatelessWidget {
itemCount: characters.length, itemCount: characters.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
final characterDTO = characters[index]; final characterDTO = characters[index];
return StatefulBuilder(
builder: (context, setState) {
return ListTile( return ListTile(
leading: SizedBox( leading: SizedBox(
width: 40, width: 40,
@ -134,6 +143,28 @@ class MyHomePage extends StatelessWidget {
), ),
title: Text(characterDTO.name), title: Text(characterDTO.name),
subtitle: Text(characterDTO.typeString), subtitle: Text(characterDTO.typeString),
trailing: IconButton(
icon: Icon(
characterDTO.isLiked ? Icons.favorite : Icons.favorite_border,
color: characterDTO.isLiked ? Colors.red : Colors.grey,
),
onPressed: () {
setState(() {
characterDTO.isLiked = !characterDTO.isLiked;
});
final message = characterDTO.isLiked
? (AppLocale.of(context)?.likeMessage(characterDTO.name) ?? 'Понравился персонаж')
: (AppLocale.of(context)?.unlikeMessage(characterDTO.name) ?? 'Персонаж больше не понравился');
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(message),
duration: const Duration(seconds: 1),
),
);
},
),
onTap: () { onTap: () {
Navigator.push( Navigator.push(
context, context,
@ -145,6 +176,8 @@ class MyHomePage extends StatelessWidget {
); );
}, },
); );
},
);
} else { } else {
return Center(child: Text(AppLocale.of(context)?.noData ?? 'No Data')); return Center(child: Text(AppLocale.of(context)?.noData ?? 'No Data'));
} }

View File

@ -91,34 +91,39 @@ class CharacterDTO {
final String characterType; final String characterType;
final String backstory; final String backstory;
final String imageUrl; final String imageUrl;
bool isLiked; // Добавлено поле для состояния лайка
CharacterDTO({ CharacterDTO({
required this.name, required this.name,
required this.characterType, required this.characterType,
required this.backstory, required this.backstory,
required this.imageUrl, required this.imageUrl,
this.isLiked = false, // Значение по умолчанию - false
}); });
// Метод для преобразования в DTO (можно удалить, так как он уже возвращает текущий объект)
CharacterDTO toDTO() { CharacterDTO toDTO() {
return CharacterDTO( return CharacterDTO(
name: name, name: name,
characterType: typeString, characterType: typeString,
backstory: backstory, backstory: backstory,
imageUrl: imageUrl, imageUrl: imageUrl,
isLiked: isLiked,
); );
} }
// Добавим метод fromJson // Метод fromJson для создания объекта из Map
factory CharacterDTO.fromJson(Map<String, dynamic> json) { factory CharacterDTO.fromJson(Map<String, dynamic> json) {
return CharacterDTO( return CharacterDTO(
name: json['name'], name: json['name'],
characterType: json['type'], characterType: json['type'],
backstory: json['backstory'], backstory: json['backstory'],
imageUrl: json['image_url'], imageUrl: json['image_url'],
isLiked: json['isLiked'] ?? false, // Поддержка поля isLiked
); );
} }
// Геттер для typeString // Геттер для типа в строковом виде
String get typeString { String get typeString {
switch (characterType) { switch (characterType) {
case 'Выживший': case 'Выживший':
@ -137,16 +142,19 @@ class CharacterDTO {
type: characterType == 'Выживший' ? CharacterType.Survivor : CharacterType.Hunter, type: characterType == 'Выживший' ? CharacterType.Survivor : CharacterType.Hunter,
backstory: backstory, backstory: backstory,
imageUrl: imageUrl, imageUrl: imageUrl,
isLiked: isLiked,
); );
} }
// Метод для преобразования в Map // Метод для преобразования объекта в Map
Map<String, dynamic> toMap() { Map<String, dynamic> toMap() {
return { return {
'name': name, 'name': name,
'type': characterType, 'type': characterType,
'backstory': backstory, 'backstory': backstory,
'image_url': imageUrl, 'image_url': imageUrl,
'isLiked': isLiked, // Добавляем поле isLiked в Map
}; };
} }
} }