Лаба 7, локализация для доп текста карточек
This commit is contained in:
parent
77ed129792
commit
b7ab60f889
@ -4,6 +4,8 @@
|
||||
"search": "Search",
|
||||
"liked": "liked!",
|
||||
"disliked": "disliked :(",
|
||||
"location": "Location",
|
||||
"species": "Species",
|
||||
|
||||
"arbEnding": "Чтобы не забыть про отсутствие запятой :)"
|
||||
}
|
@ -4,6 +4,8 @@
|
||||
"search": "Поиск",
|
||||
"liked": "Добавлено в понравившиеся :)",
|
||||
"disliked": "Удалено из понравившегося :(",
|
||||
"location": "Местоположение",
|
||||
"species": "Вид",
|
||||
|
||||
"arbEnding": "Чтобы не забыть про отсутствие запятой :)"
|
||||
}
|
@ -113,6 +113,18 @@ abstract class AppLocale {
|
||||
/// **'Удалено из понравившегося :('**
|
||||
String get disliked;
|
||||
|
||||
/// No description provided for @location.
|
||||
///
|
||||
/// In ru, this message translates to:
|
||||
/// **'Местоположение'**
|
||||
String get location;
|
||||
|
||||
/// No description provided for @species.
|
||||
///
|
||||
/// In ru, this message translates to:
|
||||
/// **'Вид'**
|
||||
String get species;
|
||||
|
||||
/// No description provided for @arbEnding.
|
||||
///
|
||||
/// In ru, this message translates to:
|
||||
|
@ -15,6 +15,12 @@ class AppLocaleEn extends AppLocale {
|
||||
@override
|
||||
String get disliked => 'disliked :(';
|
||||
|
||||
@override
|
||||
String get location => 'Location';
|
||||
|
||||
@override
|
||||
String get species => 'Species';
|
||||
|
||||
@override
|
||||
String get arbEnding => 'Чтобы не забыть про отсутствие запятой :)';
|
||||
}
|
||||
|
@ -15,6 +15,12 @@ class AppLocaleRu extends AppLocale {
|
||||
@override
|
||||
String get disliked => 'Удалено из понравившегося :(';
|
||||
|
||||
@override
|
||||
String get location => 'Местоположение';
|
||||
|
||||
@override
|
||||
String get species => 'Вид';
|
||||
|
||||
@override
|
||||
String get arbEnding => 'Чтобы не забыть про отсутствие запятой :)';
|
||||
}
|
||||
|
@ -17,6 +17,8 @@ extension CharacterDataDtoToModel on CharacterDataDto {
|
||||
attributes?.name ?? 'UNKNOWN',
|
||||
imageUrl: attributes?.image ?? _imagePlaceholder,
|
||||
descriptionText: _makeDescriptionText(attributes?.born, attributes?.died),
|
||||
speciesText: '',
|
||||
locationText: '',
|
||||
);
|
||||
|
||||
String _makeDescriptionText(String? born, String? died) {
|
||||
|
@ -9,9 +9,10 @@ extension RandMCharacterDataDtoMapper on RandMCharacterDataDto {
|
||||
CardData toDomain() => CardData(
|
||||
name ?? 'UNKNOWN',
|
||||
imageUrl: image ?? _imagePlaceholder,
|
||||
descriptionText:
|
||||
'Местоположение:\n${location?.name ?? 'unknown'}\n\nВид:\n${species ?? 'unknown'}',
|
||||
descriptionText: '',
|
||||
id: id,
|
||||
speciesText: species ?? 'unknown',
|
||||
locationText: location?.name ?? 'unknown',
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -4,6 +4,8 @@ class CardData {
|
||||
final String text;
|
||||
final IconData icon;
|
||||
final String descriptionText;
|
||||
final String locationText;
|
||||
final String speciesText;
|
||||
final String? imageUrl;
|
||||
final int? id;
|
||||
|
||||
@ -11,6 +13,8 @@ class CardData {
|
||||
this.text, {
|
||||
this.icon = Icons.bookmark_border,
|
||||
required this.descriptionText,
|
||||
required this.locationText,
|
||||
required this.speciesText,
|
||||
this.imageUrl,
|
||||
this.id,
|
||||
});
|
||||
|
@ -1,3 +1,4 @@
|
||||
import 'package:app/components/extensions/context_x.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:app/domain/models/card.dart';
|
||||
@ -34,7 +35,8 @@ class DetailsPage extends StatelessWidget {
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(9.0),
|
||||
child: Text(
|
||||
data.descriptionText,
|
||||
'${context.locale.location}:\n${data.locationText}\n\n'
|
||||
'${context.locale.species}:\n${data.speciesText}',
|
||||
style: Theme.of(context).textTheme.bodyLarge,
|
||||
),
|
||||
)
|
||||
|
@ -6,6 +6,8 @@ class _Card extends StatelessWidget {
|
||||
final String text;
|
||||
final IconData icon;
|
||||
final String descriptionText;
|
||||
final String locationText;
|
||||
final String speciesText;
|
||||
final String? imageUrl;
|
||||
final OnLikeCallBack onLike;
|
||||
final VoidCallback? onTap;
|
||||
@ -15,6 +17,8 @@ class _Card extends StatelessWidget {
|
||||
const _Card(this.text, {
|
||||
this.icon = Icons.bookmark_border,
|
||||
required this.descriptionText,
|
||||
required this.locationText,
|
||||
required this.speciesText,
|
||||
this.imageUrl,
|
||||
this.onLike,
|
||||
this.onTap,
|
||||
@ -30,6 +34,8 @@ class _Card extends StatelessWidget {
|
||||
_Card(
|
||||
data.text,
|
||||
descriptionText: data.descriptionText,
|
||||
locationText: data.locationText,
|
||||
speciesText: data.speciesText,
|
||||
icon: data.icon,
|
||||
imageUrl: data.imageUrl,
|
||||
onLike: onLike,
|
||||
@ -88,6 +94,11 @@ class _Card extends StatelessWidget {
|
||||
.textTheme
|
||||
.headlineSmall,
|
||||
),
|
||||
Text(
|
||||
'${context.locale.location}:\n${locationText}\n\n'
|
||||
'${context.locale.species}: ${speciesText}',
|
||||
style: Theme.of(context).textTheme.bodyMedium,
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
|
@ -61,7 +61,7 @@ class _BodyState extends State<Body> {
|
||||
}
|
||||
|
||||
void _onNextPageListener() {
|
||||
if (scrollController.offset > scrollController.position.maxScrollExtent) {
|
||||
if (scrollController.offset >= scrollController.position.maxScrollExtent) {
|
||||
final bloc = context.read<HomeBloc>();
|
||||
if (!bloc.state.isPaginationLoading) {
|
||||
bloc.add(HomeLoadDataEvent(
|
||||
@ -110,12 +110,11 @@ class _BodyState extends State<Body> {
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(right: 12),
|
||||
child: BlocBuilder<LocaleBloc, LocaleState>(
|
||||
builder: (context, state) {
|
||||
return state.currentLocale.languageCode == 'ru'
|
||||
? const SvgRu()
|
||||
: const SvgUk();
|
||||
}
|
||||
),
|
||||
builder: (context, state) {
|
||||
return state.currentLocale.languageCode == 'ru'
|
||||
? const SvgRu()
|
||||
: const SvgUk();
|
||||
}),
|
||||
),
|
||||
),
|
||||
)
|
||||
@ -133,30 +132,32 @@ class _BodyState extends State<Body> {
|
||||
: state.isLoading
|
||||
? const CircularProgressIndicator()
|
||||
: BlocBuilder<LikeBloc, LikeState>(
|
||||
builder: (context, likeState) {
|
||||
builder: (context, likeState) {
|
||||
return Expanded(
|
||||
child: RefreshIndicator(
|
||||
onRefresh: _onRefresh,
|
||||
child: ListView.builder(
|
||||
controller: scrollController,
|
||||
padding: EdgeInsets.zero,
|
||||
itemCount: state.data?.data?.length ?? 0,
|
||||
itemBuilder: (context, index) {
|
||||
final data = state.data?.data?[index];
|
||||
return data != null
|
||||
? _Card.fromData(
|
||||
data,
|
||||
onLike: _onLike,
|
||||
isLiked: likeState.likedIds?.contains(data.id.toString()) == true,
|
||||
onTap: () => _navToDetails(context, data),
|
||||
)
|
||||
: const SizedBox.shrink();
|
||||
},
|
||||
),
|
||||
child: RefreshIndicator(
|
||||
onRefresh: _onRefresh,
|
||||
child: ListView.builder(
|
||||
controller: scrollController,
|
||||
padding: EdgeInsets.zero,
|
||||
itemCount: state.data?.data?.length ?? 0,
|
||||
itemBuilder: (context, index) {
|
||||
final data = state.data?.data?[index];
|
||||
return data != null
|
||||
? _Card.fromData(
|
||||
data,
|
||||
onLike: _onLike,
|
||||
isLiked: likeState.likedIds?.contains(
|
||||
data.id.toString()) ==
|
||||
true,
|
||||
onTap: () =>
|
||||
_navToDetails(context, data),
|
||||
)
|
||||
: const SizedBox.shrink();
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
),
|
||||
),
|
||||
);
|
||||
}),
|
||||
),
|
||||
BlocBuilder<HomeBloc, HomeState>(
|
||||
builder: (context, state) => state.isPaginationLoading
|
||||
@ -186,7 +187,7 @@ class _BodyState extends State<Body> {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
|
||||
content: Text(
|
||||
'$title ${isLiked ? context.locale.disliked : context.locale.liked}',
|
||||
'$title ${isLiked ? context.locale.liked : context.locale.disliked}',
|
||||
style: Theme.of(context).textTheme.bodyLarge,
|
||||
),
|
||||
backgroundColor: Color(0xFFFFFFFF),
|
||||
@ -196,9 +197,9 @@ class _BodyState extends State<Body> {
|
||||
}
|
||||
|
||||
void _onLike(String? id, String title, bool isLiked) {
|
||||
if (id != null){
|
||||
if (id != null) {
|
||||
context.read<LikeBloc>().add(ChangeLikeEvent(id));
|
||||
_showSnackBar(context, title, isLiked);
|
||||
_showSnackBar(context, title, !isLiked);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -10,30 +10,50 @@ class MockRepository extends ApiInterface {
|
||||
CardData(
|
||||
descriptionText: 'И давно тебе 17?',
|
||||
'Бенто-торт "Сумерки"',
|
||||
imageUrl: 'https://i.pinimg.com/736x/ef/5a/80/ef5a80844de4afb19750d67f1f5be04d.jpg',
|
||||
imageUrl:
|
||||
'https://i.pinimg.com/736x/ef/5a/80/ef5a80844de4afb19750d67f1f5be04d.jpg',
|
||||
speciesText: '',
|
||||
locationText: '',
|
||||
),
|
||||
CardData(
|
||||
'Бенто-торт "Material Girl"',
|
||||
descriptionText: 'Главное какой fabric, какой material',
|
||||
imageUrl:
|
||||
'https://i.pinimg.com/736x/f5/88/0c/f5880cc5b09e602c1849d4093d17eb8e.jpg',
|
||||
speciesText: '',
|
||||
locationText: '',
|
||||
),
|
||||
CardData('Бенто-торт "Material Girl"',
|
||||
descriptionText: 'Главное какой fabric, какой material',
|
||||
imageUrl: 'https://i.pinimg.com/736x/f5/88/0c/f5880cc5b09e602c1849d4093d17eb8e.jpg'),
|
||||
CardData(
|
||||
'Бенто-торт "Шрек"',
|
||||
descriptionText: 'Somebody once told me the world is gonna roll me',
|
||||
imageUrl: 'https://i.pinimg.com/736x/a9/0d/fb/a90dfb9dfe3b4f4e1c5ce3cb99847a1e.jpg',
|
||||
imageUrl:
|
||||
'https://i.pinimg.com/736x/a9/0d/fb/a90dfb9dfe3b4f4e1c5ce3cb99847a1e.jpg',
|
||||
speciesText: '',
|
||||
locationText: '',
|
||||
),
|
||||
CardData(
|
||||
'Бенто-торт "Дурак"',
|
||||
descriptionText: 'Сам дурак',
|
||||
imageUrl: 'https://i.pinimg.com/564x/11/87/8a/11878a2f6a0c5d26e38ce68cbbe21337.jpg',
|
||||
imageUrl:
|
||||
'https://i.pinimg.com/564x/11/87/8a/11878a2f6a0c5d26e38ce68cbbe21337.jpg',
|
||||
speciesText: '',
|
||||
locationText: '',
|
||||
),
|
||||
CardData(
|
||||
'Бенто-торт "Совунья"',
|
||||
descriptionText: 'Я просто смешариков люблю',
|
||||
imageUrl: 'https://i.pinimg.com/564x/85/61/d2/8561d2b601fe9eb72c4e2031bbb6ba24.jpg',
|
||||
imageUrl:
|
||||
'https://i.pinimg.com/564x/85/61/d2/8561d2b601fe9eb72c4e2031bbb6ba24.jpg',
|
||||
speciesText: '',
|
||||
locationText: '',
|
||||
),
|
||||
CardData(
|
||||
'Бенто-торт "В смысле 28?"',
|
||||
descriptionText: 'Напишем любой возраст (или срок)',
|
||||
imageUrl: 'https://i.pinimg.com/564x/ae/76/0a/ae760af69d9a0c12938753a372112ee4.jpg',
|
||||
imageUrl:
|
||||
'https://i.pinimg.com/564x/ae/76/0a/ae760af69d9a0c12938753a372112ee4.jpg',
|
||||
speciesText: '',
|
||||
locationText: '',
|
||||
),
|
||||
]);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user