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