lab7 #7

Merged
ns.potapov merged 2 commits from lab7 into main 2024-12-21 18:19:28 +04:00
6 changed files with 63 additions and 80 deletions

View File

@ -2,8 +2,8 @@
"@@locale": "en", "@@locale": "en",
"search": "Search", "search": "Search",
"liked": "liked!", "liked": "You liked:",
"disliked": "disliked :(", "disliked": "You disliked:",
"arbEnding": "Чтобы не забыть про отсутствие запятой :)" "arbEnding": "Чтобы не забыть про отсутствие запятой :)"
} }

View File

@ -2,8 +2,8 @@
"@@locale": "ru", "@@locale": "ru",
"search": "Поиск", "search": "Поиск",
"liked": "понравился!", "liked": "Вы поставили лайк:",
"disliked": "разонравился :(", "disliked": "Вы убрали лайк:",
"arbEnding": "Чтобы не забыть про отсутствие запятой :)" "arbEnding": "Чтобы не забыть про отсутствие запятой :)"
} }

View File

@ -104,13 +104,13 @@ abstract class AppLocale {
/// No description provided for @liked. /// No description provided for @liked.
/// ///
/// In ru, this message translates to: /// In ru, this message translates to:
/// **'понравился!'** /// **'Вы поставили лайк:'**
String get liked; String get liked;
/// No description provided for @disliked. /// No description provided for @disliked.
/// ///
/// In ru, this message translates to: /// In ru, this message translates to:
/// **'разонравился :('** /// **'Вы убрали лайк:'**
String get disliked; String get disliked;
/// No description provided for @arbEnding. /// No description provided for @arbEnding.

View File

@ -10,10 +10,10 @@ class AppLocaleEn extends AppLocale {
String get search => 'Search'; String get search => 'Search';
@override @override
String get liked => 'liked!'; String get liked => 'You liked:';
@override @override
String get disliked => 'disliked :('; String get disliked => 'You disliked:';
@override @override
String get arbEnding => 'Чтобы не забыть про отсутствие запятой :)'; String get arbEnding => 'Чтобы не забыть про отсутствие запятой :)';

View File

@ -10,10 +10,10 @@ class AppLocaleRu extends AppLocale {
String get search => 'Поиск'; String get search => 'Поиск';
@override @override
String get liked => 'понравился!'; String get liked => 'Вы поставили лайк:';
@override @override
String get disliked => 'разонравился :('; String get disliked => 'Вы убрали лайк:';
@override @override
String get arbEnding => 'Чтобы не забыть про отсутствие запятой :)'; String get arbEnding => 'Чтобы не забыть про отсутствие запятой :)';

View File

@ -62,10 +62,10 @@ class _BodyState extends State<_Body> {
final bloc = context.read<HomeBloc>(); final bloc = context.read<HomeBloc>();
if (!bloc.state.isPaginationLoading) { if (!bloc.state.isPaginationLoading) {
bloc.add(HomeLoadDataEvent( bloc.add(HomeLoadDataEvent(
search: searchController.text, search: searchController.text,
pageNumber: bloc.state.data?.pageNumber, pageNumber: bloc.state.data?.pageNumber,
nextPageNumber: bloc.state.data?.nextPageNumber, nextPageNumber: bloc.state.data?.nextPageNumber,
lastPageNumber: bloc.state.data?.lastPageNumber lastPageNumber: bloc.state.data?.lastPageNumber
)); ));
} }
} }
@ -81,7 +81,10 @@ class _BodyState extends State<_Body> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Padding( return Padding(
padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top), padding: EdgeInsets.only(top: MediaQuery
.of(context)
.padding
.top),
child: Column( child: Column(
children: [ children: [
Row( Row(
@ -94,9 +97,10 @@ class _BodyState extends State<_Body> {
controller: searchController, controller: searchController,
placeholder: context.locale.search, placeholder: context.locale.search,
onChanged: (search) { onChanged: (search) {
Debounce.run(() => context Debounce.run(() =>
.read<HomeBloc>() context
.add(HomeLoadDataEvent(search: search))); .read<HomeBloc>()
.add(HomeLoadDataEvent(search: search)));
}, },
), ),
), ),
@ -121,47 +125,50 @@ class _BodyState extends State<_Body> {
], ],
), ),
BlocBuilder<HomeBloc, HomeState>( BlocBuilder<HomeBloc, HomeState>(
builder: (context, state) => state.error != null builder: (context, state) =>
state.error != null
? Text( ? Text(
state.error ?? '', state.error ?? '',
style: Theme.of(context) style: Theme
.textTheme .of(context)
.headlineSmall .textTheme
?.copyWith(color: Colors.red), .headlineSmall
) ?.copyWith(color: Colors.red),
)
: state.isLoading : state.isLoading
? const CircularProgressIndicator() ? const CircularProgressIndicator()
: BlocBuilder<LikeBloc, LikeState>( : BlocBuilder<LikeBloc, LikeState>(
builder: (context, likeState) { builder: (context, likeState) {
return Expanded( return Expanded(
child: RefreshIndicator( child: RefreshIndicator(
onRefresh: _onRefresh, onRefresh: _onRefresh,
child: ListView.builder( child: ListView.builder(
controller: scrollController, controller: scrollController,
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
itemCount: state.data?.data?.length ?? 0, itemCount: state.data?.data?.length ?? 0,
itemBuilder: (context, index) { itemBuilder: (context, index) {
final data = state.data?.data?[index]; final data = state.data?.data?[index];
return data != null return data != null
? _Card.fromData( ? _Card.fromData(
data, data,
onLike: _onLike, onLike: _onLike,
isLiked: likeState.likedIds isLiked: likeState.likedIds
?.contains(data.id) == ?.contains(data.id) ==
true, true,
onTap: () => onTap: () =>
_navToDetails(context, data), _navToDetails(context, data),
) )
: const SizedBox.shrink(); : const SizedBox.shrink();
}, },
), ),
), ),
); );
}, },
), ),
), ),
BlocBuilder<HomeBloc, HomeState>( BlocBuilder<HomeBloc, HomeState>(
builder: (context, state) => state.isPaginationLoading builder: (context, state) =>
state.isPaginationLoading
? const CircularProgressIndicator() ? const CircularProgressIndicator()
: const SizedBox.shrink(), : const SizedBox.shrink(),
), ),
@ -195,7 +202,7 @@ class _BodyState extends State<_Body> {
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar( ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text( content: Text(
'${isLiked ? 'Вы поставили лайк: ' : 'Вы убрали лайк: '} $title', '${isLiked ? context.locale.liked : context.locale.disliked } $title',
style: const TextStyle( style: const TextStyle(
color: Colors.black45, fontSize: 20, fontWeight: FontWeight.bold), color: Colors.black45, fontSize: 20, fontWeight: FontWeight.bold),
), ),
@ -205,27 +212,3 @@ class _BodyState extends State<_Body> {
}); });
} }
} }
//
// @override
// Widget build(BuildContext context) {
// final data = ApiRepository().loadData();
// return Center(
// child: FutureBuilder<List<CardData>?>(
// future: data,
// builder: (context, snapshot) => SingleChildScrollView(
// child: snapshot.hasData
// ? Column(
// mainAxisAlignment: MainAxisAlignment.center,
// children: snapshot.data
// ?.map((data) => CardPost.fromData(data,
// onLike: (String title, bool isLiked) =>
// _showSnackBar(context, title, isLiked),
// onTap: () => _navToDetails(context, data)))
// .toList() ??
// [])
// : const CircularProgressIndicator(),
// ),
// ),
// );
// }