ура, всё готово!!
This commit is contained in:
parent
223eceb238
commit
a3cf2f9282
@ -4,5 +4,7 @@
|
||||
"changeLanguage": "English",
|
||||
"errorMessage": "{message}",
|
||||
"noData": "No data",
|
||||
"characterTitle": "Character: {name}"
|
||||
"characterTitle": "Character: {name}",
|
||||
"likeMessage": "Liked {characterName}!",
|
||||
"unlikeMessage": "{characterName} unliked!"
|
||||
}
|
||||
|
@ -4,5 +4,7 @@
|
||||
"changeLanguage": "Русский",
|
||||
"errorMessage": "{message}",
|
||||
"noData": "Нет данных",
|
||||
"characterTitle": "Персонаж: {name}"
|
||||
"characterTitle": "Персонаж: {name}",
|
||||
"likeMessage": "Понравился {characterName}!",
|
||||
"unlikeMessage": "{characterName} больше не нравится!"
|
||||
}
|
||||
|
@ -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> {
|
||||
|
@ -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!';
|
||||
}
|
||||
}
|
||||
|
@ -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 больше не нравится!';
|
||||
}
|
||||
}
|
||||
|
@ -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'));
|
||||
}
|
||||
|
@ -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
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user