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

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",
"errorMessage": "{message}",
"noData": "No data",
"characterTitle": "Character: {name}"
"characterTitle": "Character: {name}",
"likeMessage": "Liked {characterName}!",
"unlikeMessage": "{characterName} unliked!"
}

View File

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

View File

@ -130,6 +130,18 @@ abstract class AppLocale {
/// In ru, this message translates to:
/// **'Персонаж: {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> {

View File

@ -27,4 +27,14 @@ class AppLocaleEn extends AppLocale {
String characterTitle(Object 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) {
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);
},
),
IconButton(
icon: const Icon(Icons.refresh),
onPressed: () {
// Отправляем событие для обновления данных
context.read<HomeBloc>().add(HomeLoadDataEvent());
},
),
IconButton(
icon: const Icon(Icons.search),
onPressed: () {
@ -127,6 +134,8 @@ class MyHomePage extends StatelessWidget {
itemCount: characters.length,
itemBuilder: (context, index) {
final characterDTO = characters[index];
return StatefulBuilder(
builder: (context, setState) {
return ListTile(
leading: SizedBox(
width: 40,
@ -134,6 +143,28 @@ class MyHomePage extends StatelessWidget {
),
title: Text(characterDTO.name),
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: () {
Navigator.push(
context,
@ -145,6 +176,8 @@ class MyHomePage extends StatelessWidget {
);
},
);
},
);
} else {
return Center(child: Text(AppLocale.of(context)?.noData ?? 'No Data'));
}

View File

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