From e3e56c03239227751cd8d0fc302ef7d34b7ca090 Mon Sep 17 00:00:00 2001 From: goldfest228 Date: Tue, 17 Dec 2024 12:25:44 +0400 Subject: [PATCH] lab7 --- assets/cover.png | Bin 0 -> 24177 bytes assets/ic_launcher.png | Bin 0 -> 18819 bytes assets/play_store_512.png | Bin 0 -> 23859 bytes assets/svg/ru.svg | 1 + assets/svg/uk.svg | 2 + l10n.yaml | 6 ++ l10n/app_en.arb | 9 +++ l10n/app_ru.arb | 9 +++ lib/components/extensions/context_x.dart | 7 +++ lib/components/resources.g.dart | 11 ++++ lib/components/utils/debounce.dart | 22 +++++++ lib/presentation/common/svg_objects.dart | 35 +++++++++++ lib/presentation/like_bloc/like_bloc.dart | 35 +++++++++++ lib/presentation/like_bloc/like_event.dart | 13 ++++ lib/presentation/like_bloc/like_state.dart | 14 +++++ lib/presentation/like_bloc/like_state.g.dart | 56 ++++++++++++++++++ lib/presentation/locale_bloc/locale_bloc.dart | 17 ++++++ .../locale_bloc/locale_events.dart | 7 +++ .../locale_bloc/locale_state.dart | 15 +++++ .../locale_bloc/locale_state.g.dart | 56 ++++++++++++++++++ makefile | 14 +++++ 21 files changed, 329 insertions(+) create mode 100644 assets/cover.png create mode 100644 assets/ic_launcher.png create mode 100644 assets/play_store_512.png create mode 100644 assets/svg/ru.svg create mode 100644 assets/svg/uk.svg create mode 100644 l10n.yaml create mode 100644 l10n/app_en.arb create mode 100644 l10n/app_ru.arb create mode 100644 lib/components/extensions/context_x.dart create mode 100644 lib/components/resources.g.dart create mode 100644 lib/components/utils/debounce.dart create mode 100644 lib/presentation/common/svg_objects.dart create mode 100644 lib/presentation/like_bloc/like_bloc.dart create mode 100644 lib/presentation/like_bloc/like_event.dart create mode 100644 lib/presentation/like_bloc/like_state.dart create mode 100644 lib/presentation/like_bloc/like_state.g.dart create mode 100644 lib/presentation/locale_bloc/locale_bloc.dart create mode 100644 lib/presentation/locale_bloc/locale_events.dart create mode 100644 lib/presentation/locale_bloc/locale_state.dart create mode 100644 lib/presentation/locale_bloc/locale_state.g.dart create mode 100644 makefile diff --git a/assets/cover.png b/assets/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..8cf70c047ff41979590e29ea53f379d7dc9bb6c8 GIT binary patch literal 24177 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
BBy%jN)DQM;d`EEGM~}Jz~#rE;JJ@~ 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 literal 0 HcmV?d00001 diff --git a/assets/ic_launcher.png b/assets/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..89993ad727cccc81573dff7296af44b4c83baa9c GIT binary patch literal 18819 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 BOC$gQ literal 0 HcmV?d00001 diff --git a/assets/svg/ru.svg b/assets/svg/ru.svg new file mode 100644 index 0000000..9c0cc49 --- /dev/null +++ b/assets/svg/ru.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/svg/uk.svg b/assets/svg/uk.svg new file mode 100644 index 0000000..f87fdb0 --- /dev/null +++ b/assets/svg/uk.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/l10n.yaml b/l10n.yaml new file mode 100644 index 0000000..d26d702 --- /dev/null +++ b/l10n.yaml @@ -0,0 +1,6 @@ +arb-dir: l10n +template-arb-file: app_ru.arb +output-localization-file: app_locale.dart +output-dir: lib/components/locale/l10n +output-class: AppLocale +synthetic-package: false \ No newline at end of file diff --git a/l10n/app_en.arb b/l10n/app_en.arb new file mode 100644 index 0000000..3059e44 --- /dev/null +++ b/l10n/app_en.arb @@ -0,0 +1,9 @@ + { + "@@locale": "en", + + "search": "Search", + "liked": "liked!", + "disliked": "disliked", + + "arbEnding": "Чтобы не забыть про отсутствие запятой :)" +} \ No newline at end of file diff --git a/l10n/app_ru.arb b/l10n/app_ru.arb new file mode 100644 index 0000000..b823375 --- /dev/null +++ b/l10n/app_ru.arb @@ -0,0 +1,9 @@ +{ + "@@locale": "ru", + + "search": "Поиск", + "liked": "понравился!", + "disliked": "разонравился", + + "arbEnding": "Чтобы не забыть про отсутствие запятой :)" +} \ No newline at end of file diff --git a/lib/components/extensions/context_x.dart b/lib/components/extensions/context_x.dart new file mode 100644 index 0000000..e4bc92a --- /dev/null +++ b/lib/components/extensions/context_x.dart @@ -0,0 +1,7 @@ +import 'package:flutter/cupertino.dart'; + +import '../locale/l10n/app_locale.dart'; + +extension LocalContextX on BuildContext { + AppLocale get locale => AppLocale.of(this)!; //делает удобное обращение к локале +} diff --git a/lib/components/resources.g.dart b/lib/components/resources.g.dart new file mode 100644 index 0000000..6c4e411 --- /dev/null +++ b/lib/components/resources.g.dart @@ -0,0 +1,11 @@ +/// Generate by [flutter_assets_generator](https://github.com/goodswifter/flutter_assets_generator) library. +/// +/// PLEASE DO NOT EDIT MANUALLY. +class R { + // сгенерировали пути до наших ресурсов + const R._(); + + static const String assetsSvgRuSvg = 'assets/svg/ru.svg'; + + static const String assetsSvgUkSvg = 'assets/svg/uk.svg'; +} diff --git a/lib/components/utils/debounce.dart b/lib/components/utils/debounce.dart new file mode 100644 index 0000000..5e04d15 --- /dev/null +++ b/lib/components/utils/debounce.dart @@ -0,0 +1,22 @@ +import 'dart:async'; +import 'dart:ui'; + +class Debounce { + //помощник + factory Debounce() => _instance; //обращение через статический конструктор + + Debounce._(); + + static final Debounce _instance = Debounce._(); + + static Timer? _timer; + + static void run( + //создаём задержку для ввода пользователя в поисковую строку + VoidCallback action, { + Duration delay = const Duration(milliseconds: 500), + }) { + _timer?.cancel(); + _timer = Timer(delay, action); + } +} diff --git a/lib/presentation/common/svg_objects.dart b/lib/presentation/common/svg_objects.dart new file mode 100644 index 0000000..fece446 --- /dev/null +++ b/lib/presentation/common/svg_objects.dart @@ -0,0 +1,35 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import '../../components/resources.g.dart'; + +abstract class SvgObjects { + static void init() { + // подгрузка иконок в кеш перед их использованием + final pics = [ + R.assetsSvgRuSvg, + R.assetsSvgUkSvg, + ]; + for (final String p in pics) { + final loader = SvgAssetLoader(p); + svg.cache.putIfAbsent(loader.cacheKey(null), () => loader.loadBytes(null)); + } + } +} + +class SvgRu extends StatelessWidget { + const SvgRu({super.key}); + + @override + Widget build(BuildContext context) { + return SvgPicture.asset(R.assetsSvgRuSvg); + } +} + +class SvgUk extends StatelessWidget { + const SvgUk({super.key}); + + @override + Widget build(BuildContext context) { + return SvgPicture.asset(R.assetsSvgUkSvg); + } +} diff --git a/lib/presentation/like_bloc/like_bloc.dart b/lib/presentation/like_bloc/like_bloc.dart new file mode 100644 index 0000000..40d00f0 --- /dev/null +++ b/lib/presentation/like_bloc/like_bloc.dart @@ -0,0 +1,35 @@ +import 'package:flutter_bloc/flutter_bloc.dart%20%20'; +import 'package:flutter_test_app/presentation/like_bloc/like_event.dart'; +import 'package:flutter_test_app/presentation/like_bloc/like_state.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +const String _likedPrefsKey = 'liked'; + +class LikeBloc extends Bloc { + LikeBloc() : super(const LikeState(likedIds: [])) { + on(_onChangeLike); + on(_onLoadLikes); + } + + Future _onLoadLikes(LoadLikesEvent event, Emitter emit) async { + final prefs = await SharedPreferences.getInstance(); + final data = prefs.getStringList(_likedPrefsKey); + + emit(state.copyWith(likedIds: data)); + } + + Future _onChangeLike(ChangeLikeEvent event, Emitter emit) async { + final updatedList = List.from(state.likedIds ?? []); + + if (updatedList.contains(event.id)) { + // проверка установлен ли лайк + updatedList.remove(event.id); + } else { + updatedList.add(event.id); + } + + final prefs = await SharedPreferences.getInstance(); + prefs.setStringList(_likedPrefsKey, updatedList); + emit(state.copyWith(likedIds: updatedList)); + } +} diff --git a/lib/presentation/like_bloc/like_event.dart b/lib/presentation/like_bloc/like_event.dart new file mode 100644 index 0000000..d0326d8 --- /dev/null +++ b/lib/presentation/like_bloc/like_event.dart @@ -0,0 +1,13 @@ +abstract class LikeEvent { + const LikeEvent(); +} + +class LoadLikesEvent extends LikeEvent { + const LoadLikesEvent(); +} + +class ChangeLikeEvent extends LikeEvent { + final String id; + + const ChangeLikeEvent(this.id); +} diff --git a/lib/presentation/like_bloc/like_state.dart b/lib/presentation/like_bloc/like_state.dart new file mode 100644 index 0000000..5f0959f --- /dev/null +++ b/lib/presentation/like_bloc/like_state.dart @@ -0,0 +1,14 @@ +import 'package:copy_with_extension/copy_with_extension.dart'; +import 'package:equatable/equatable.dart'; + +part 'like_state.g.dart'; + +@CopyWith() +class LikeState extends Equatable { + final List? likedIds; + + const LikeState({required this.likedIds}); + + @override + List get props => [likedIds]; +} diff --git a/lib/presentation/like_bloc/like_state.g.dart b/lib/presentation/like_bloc/like_state.g.dart new file mode 100644 index 0000000..0888cf2 --- /dev/null +++ b/lib/presentation/like_bloc/like_state.g.dart @@ -0,0 +1,56 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'like_state.dart'; + +// ************************************************************************** +// CopyWithGenerator +// ************************************************************************** + +abstract class _$LikeStateCWProxy { + LikeState likedIds(List? likedIds); + + /// This function **does support** nullification of nullable fields. All `null` values passed to `non-nullable` fields will be ignored. You can also use `LikeState(...).copyWith.fieldName(...)` to override fields one at a time with nullification support. + /// + /// Usage + /// ```dart + /// LikeState(...).copyWith(id: 12, name: "My name") + /// ```` + LikeState call({ + List? likedIds, + }); +} + +/// Proxy class for `copyWith` functionality. This is a callable class and can be used as follows: `instanceOfLikeState.copyWith(...)`. Additionally contains functions for specific fields e.g. `instanceOfLikeState.copyWith.fieldName(...)` +class _$LikeStateCWProxyImpl implements _$LikeStateCWProxy { + const _$LikeStateCWProxyImpl(this._value); + + final LikeState _value; + + @override + LikeState likedIds(List? likedIds) => this(likedIds: likedIds); + + @override + + /// This function **does support** nullification of nullable fields. All `null` values passed to `non-nullable` fields will be ignored. You can also use `LikeState(...).copyWith.fieldName(...)` to override fields one at a time with nullification support. + /// + /// Usage + /// ```dart + /// LikeState(...).copyWith(id: 12, name: "My name") + /// ```` + LikeState call({ + Object? likedIds = const $CopyWithPlaceholder(), + }) { + return LikeState( + likedIds: likedIds == const $CopyWithPlaceholder() + ? _value.likedIds + // ignore: cast_nullable_to_non_nullable + : likedIds as List?, + ); + } +} + +extension $LikeStateCopyWith on LikeState { + /// Returns a callable class that can be used as follows: `instanceOfLikeState.copyWith(...)` or like so:`instanceOfLikeState.copyWith.fieldName(...)`. + // ignore: library_private_types_in_public_api + _$LikeStateCWProxy get copyWith => _$LikeStateCWProxyImpl(this); +} diff --git a/lib/presentation/locale_bloc/locale_bloc.dart b/lib/presentation/locale_bloc/locale_bloc.dart new file mode 100644 index 0000000..19ee4e2 --- /dev/null +++ b/lib/presentation/locale_bloc/locale_bloc.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_test_app/presentation/locale_bloc/locale_events.dart'; +import 'package:flutter_test_app/presentation/locale_bloc/locale_state.dart'; +import '../../components/locale/l10n/app_locale.dart'; + +class LocaleBloc extends Bloc { + LocaleBloc(Locale defaultLocale) : super(LocaleState(currentLocale: defaultLocale)) { + on(_onChangeLocale); + } + + Future _onChangeLocale(ChangeLocaleEvent event, Emitter emit) async { + final toChange = AppLocale.supportedLocales + .firstWhere((e) => e.languageCode != state.currentLocale.languageCode); + emit(state.copyWith(currentLocale: toChange)); + } +} diff --git a/lib/presentation/locale_bloc/locale_events.dart b/lib/presentation/locale_bloc/locale_events.dart new file mode 100644 index 0000000..c08cd1b --- /dev/null +++ b/lib/presentation/locale_bloc/locale_events.dart @@ -0,0 +1,7 @@ +abstract class LocaleEvent { + const LocaleEvent(); +} + +class ChangeLocaleEvent extends LocaleEvent { + const ChangeLocaleEvent(); +} diff --git a/lib/presentation/locale_bloc/locale_state.dart b/lib/presentation/locale_bloc/locale_state.dart new file mode 100644 index 0000000..b9221ca --- /dev/null +++ b/lib/presentation/locale_bloc/locale_state.dart @@ -0,0 +1,15 @@ +import 'package:copy_with_extension/copy_with_extension.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/material.dart'; + +part 'locale_state.g.dart'; + +@CopyWith() +class LocaleState extends Equatable { + final Locale currentLocale; + + const LocaleState({required this.currentLocale}); + + @override + List get props => [currentLocale]; +} diff --git a/lib/presentation/locale_bloc/locale_state.g.dart b/lib/presentation/locale_bloc/locale_state.g.dart new file mode 100644 index 0000000..23ee063 --- /dev/null +++ b/lib/presentation/locale_bloc/locale_state.g.dart @@ -0,0 +1,56 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'locale_state.dart'; + +// ************************************************************************** +// CopyWithGenerator +// ************************************************************************** + +abstract class _$LocaleStateCWProxy { + LocaleState currentLocale(Locale currentLocale); + + /// This function **does support** nullification of nullable fields. All `null` values passed to `non-nullable` fields will be ignored. You can also use `LocaleState(...).copyWith.fieldName(...)` to override fields one at a time with nullification support. + /// + /// Usage + /// ```dart + /// LocaleState(...).copyWith(id: 12, name: "My name") + /// ```` + LocaleState call({ + Locale? currentLocale, + }); +} + +/// Proxy class for `copyWith` functionality. This is a callable class and can be used as follows: `instanceOfLocaleState.copyWith(...)`. Additionally contains functions for specific fields e.g. `instanceOfLocaleState.copyWith.fieldName(...)` +class _$LocaleStateCWProxyImpl implements _$LocaleStateCWProxy { + const _$LocaleStateCWProxyImpl(this._value); + + final LocaleState _value; + + @override + LocaleState currentLocale(Locale currentLocale) => this(currentLocale: currentLocale); + + @override + + /// This function **does support** nullification of nullable fields. All `null` values passed to `non-nullable` fields will be ignored. You can also use `LocaleState(...).copyWith.fieldName(...)` to override fields one at a time with nullification support. + /// + /// Usage + /// ```dart + /// LocaleState(...).copyWith(id: 12, name: "My name") + /// ```` + LocaleState call({ + Object? currentLocale = const $CopyWithPlaceholder(), + }) { + return LocaleState( + currentLocale: currentLocale == const $CopyWithPlaceholder() || currentLocale == null + ? _value.currentLocale + // ignore: cast_nullable_to_non_nullable + : currentLocale as Locale, + ); + } +} + +extension $LocaleStateCopyWith on LocaleState { + /// Returns a callable class that can be used as follows: `instanceOfLocaleState.copyWith(...)` or like so:`instanceOfLocaleState.copyWith.fieldName(...)`. + // ignore: library_private_types_in_public_api + _$LocaleStateCWProxy get copyWith => _$LocaleStateCWProxyImpl(this); +} diff --git a/makefile b/makefile new file mode 100644 index 0000000..821341f --- /dev/null +++ b/makefile @@ -0,0 +1,14 @@ +gen: + flutter pub run build_runner build --delete-conflicting-outputs +icon: + flutter pub run flutter_launcher_icons:main +init_res: + dart pub global activate flutter_assets_generator +format: + dart format . --line-length 100 +res: + fgen --output lib/components/resources.g.dart --no-watch --no-preview; \ + mingw32-make format +loc: + flutter gen-l10n; \ + mingw32-make format \ No newline at end of file