diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
index db77bb4..d8fd71a 100644
Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
index 17987b7..913bbca 100644
Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
index 09d4391..0fcb5de 100644
Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
index d5f1c8d..3514cdd 100644
Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
index 4d6372e..a7ccbf1 100644
Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/assets/cover.png b/assets/cover.png
new file mode 100644
index 0000000..8cf70c0
Binary files /dev/null and b/assets/cover.png differ
diff --git a/assets/ic_launcher.png b/assets/ic_launcher.png
new file mode 100644
index 0000000..89993ad
Binary files /dev/null and b/assets/ic_launcher.png differ
diff --git a/assets/play_store_512.png b/assets/play_store_512.png
new file mode 100644
index 0000000..03d87b2
Binary files /dev/null and b/assets/play_store_512.png differ
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/lib/components/utils/debounce.dart b/lib/components/utils/debounce.dart
index 60a18e1..5e04d15 100644
--- a/lib/components/utils/debounce.dart
+++ b/lib/components/utils/debounce.dart
@@ -1,7 +1,8 @@
import 'dart:async';
import 'dart:ui';
-class Debounce { //помощник
+class Debounce {
+ //помощник
factory Debounce() => _instance; //обращение через статический конструктор
Debounce._();
@@ -10,11 +11,12 @@ class Debounce { //помощник
static Timer? _timer;
- static void run(//создаём задержку для ввода пользователя в поисковую строку
- VoidCallback action, {
- Duration delay = const Duration(milliseconds: 500),
- }) {
+ static void run(
+ //создаём задержку для ввода пользователя в поисковую строку
+ VoidCallback action, {
+ Duration delay = const Duration(milliseconds: 500),
+ }) {
_timer?.cancel();
_timer = Timer(delay, action);
}
-}
\ No newline at end of file
+}
diff --git a/lib/data/mappers/characters_mapper.dart b/lib/data/mappers/characters_mapper.dart
index a22858a..6e10678 100644
--- a/lib/data/mappers/characters_mapper.dart
+++ b/lib/data/mappers/characters_mapper.dart
@@ -3,9 +3,9 @@ import '../dtos/characters_dto.dart';
extension CharacterDtoToModel on CharacterDto {
CardData toDomain() => CardData(
- displayName ?? 'UNKNOWN',
- descriptionText: developerName ?? 'Описание отсутствует',
- gameDesc: description,
- imageUrl: displayIcon,
- );
+ displayName ?? 'UNKNOWN',
+ descriptionText: developerName ?? 'Описание отсутствует',
+ gameDesc: description,
+ imageUrl: displayIcon,
+ );
}
diff --git a/lib/data/repositories/api_interface.dart b/lib/data/repositories/api_interface.dart
index 3ff1042..eddb317 100644
--- a/lib/data/repositories/api_interface.dart
+++ b/lib/data/repositories/api_interface.dart
@@ -1,8 +1,7 @@
-
import '../../domain/models/card.dart';
typedef OnErrorCallback = void Function(String? error);
-abstract class ApiInterface{
+abstract class ApiInterface {
Future?> loadData();
-}
\ No newline at end of file
+}
diff --git a/lib/data/repositories/characters_repository.dart b/lib/data/repositories/characters_repository.dart
index 8c87429..b400691 100644
--- a/lib/data/repositories/characters_repository.dart
+++ b/lib/data/repositories/characters_repository.dart
@@ -16,7 +16,10 @@ class AgentsRepository extends ApiInterface {
static const String _baseUrl = 'https://valorant-api.com/v1/ agents';
@override
- Future?> loadData({OnErrorCallback? onError,String? q,}) async {
+ Future?> loadData({
+ OnErrorCallback? onError,
+ String? q,
+ }) async {
try {
// Формирование URL для запроса
final Response response = await _dio.get(_baseUrl);
@@ -30,8 +33,9 @@ class AgentsRepository extends ApiInterface {
// Фильтрация данных по displayName
if (q != null && q.isNotEmpty) {
- data = data?.where((agent) =>
- agent.text?.toLowerCase().contains(q.toLowerCase()) ?? false).toList();
+ data = data
+ ?.where((agent) => agent.text?.toLowerCase().contains(q.toLowerCase()) ?? false)
+ .toList();
}
return data;
diff --git a/lib/data/repositories/mock_repository.dart b/lib/data/repositories/mock_repository.dart
index 049f39f..85dc4a4 100644
--- a/lib/data/repositories/mock_repository.dart
+++ b/lib/data/repositories/mock_repository.dart
@@ -1,40 +1,37 @@
-
import '../../domain/models/card.dart';
import 'api_interface.dart';
class MockRepository extends ApiInterface {
@override
- Future?> loadData() async{
+ Future?> loadData() async {
return [
- CardData(
- 'Far Cry 1',
+ CardData('Far Cry 1',
descriptionText: 'Так себе',
- imageUrl: 'https://images.stopgame.ru/games/logos/8351/c1536x856/VdQJNv5ECykaiteg212k5g/far_cry_2-square_1.jpg',
+ imageUrl:
+ 'https://images.stopgame.ru/games/logos/8351/c1536x856/VdQJNv5ECykaiteg212k5g/far_cry_2-square_1.jpg',
gameDesc: 'Обретите сверхчеловеческую мощь космодесантника. Пустите в ход смертоносные навыки и разрушительное оружие, чтобы ' +
' истребить безжалостных тиранидов. Защитите Империум в ярких одиночных боях или многопользовательских режимах с ' +
'видом от третьего лица. В продолжении экшена 2011 года Space Marine вам предстоит сразиться с врагами человечества и' +
' вновь доказать ему свою преданность в роли лейтенанта Деметрия Тита, который вернулся в ряды Ультрамаринов. Дайте отпор ' +
'ужасам Галактики в эпических боях сразу на нескольких планетах. Раскройте мрачные секреты и отбросьте тень вечной ночи.'), // создаётся объект ранее созданного контейнера
- CardData(
- 'Far Cry 2',
+ CardData('Far Cry 2',
descriptionText: 'Лучше',
- imageUrl: 'https://images.stopgame.ru/games/logos/8351/c1536x856/VdQJNv5ECykaiteg212k5g/far_cry_2-square_1.jpg',
+ imageUrl:
+ 'https://images.stopgame.ru/games/logos/8351/c1536x856/VdQJNv5ECykaiteg212k5g/far_cry_2-square_1.jpg',
gameDesc: 'Обретите сверхчеловеческую мощь космодесантника. Пустите в ход смертоносные навыки и разрушительное оружие, чтобы ' +
' истребить безжалостных тиранидов. Защитите Империум в ярких одиночных боях или многопользовательских режимах с ' +
'видом от третьего лица. В продолжении экшена 2011 года Space Marine вам предстоит сразиться с врагами человечества и' +
' вновь доказать ему свою преданность в роли лейтенанта Деметрия Тита, который вернулся в ряды Ультрамаринов. Дайте отпор ' +
'ужасам Галактики в эпических боях сразу на нескольких планетах. Раскройте мрачные секреты и отбросьте тень вечной ночи.'),
- CardData(
- 'Far Cry 3',
+ CardData('Far Cry 3',
descriptionText: 'Красавцы',
- imageUrl: 'https://images.stopgame.ru/games/logos/8351/c1536x856/VdQJNv5ECykaiteg212k5g/far_cry_2-square_1.jpg',
+ imageUrl:
+ 'https://images.stopgame.ru/games/logos/8351/c1536x856/VdQJNv5ECykaiteg212k5g/far_cry_2-square_1.jpg',
gameDesc: 'Обретите сверхчеловеческую мощь космодесантника. Пустите в ход смертоносные навыки и разрушительное оружие, чтобы ' +
' истребить безжалостных тиранидов. Защитите Империум в ярких одиночных боях или многопользовательских режимах с ' +
'видом от третьего лица. В продолжении экшена 2011 года Space Marine вам предстоит сразиться с врагами человечества и' +
' вновь доказать ему свою преданность в роли лейтенанта Деметрия Тита, который вернулся в ряды Ультрамаринов. Дайте отпор ' +
- 'ужасам Галактики в эпических боях сразу на нескольких планетах. Раскройте мрачные секреты и отбросьте тень вечной ночи.'
-
- ),
+ 'ужасам Галактики в эпических боях сразу на нескольких планетах. Раскройте мрачные секреты и отбросьте тень вечной ночи.'),
];
}
-}
\ No newline at end of file
+}
diff --git a/lib/domain/models/card.dart b/lib/domain/models/card.dart
index f5929f4..fcdc380 100644
--- a/lib/domain/models/card.dart
+++ b/lib/domain/models/card.dart
@@ -8,10 +8,10 @@ class CardData {
final String? gameDesc;
CardData(
- this.text, {
- required this.descriptionText,
- //this.icon = Icons.ac_unit_outlined,
- this.imageUrl,
- required this.gameDesc,
- });
-}
\ No newline at end of file
+ this.text, {
+ required this.descriptionText,
+ //this.icon = Icons.ac_unit_outlined,
+ this.imageUrl,
+ required this.gameDesc,
+ });
+}
diff --git a/lib/main.dart b/lib/main.dart
index 1710bb4..270757f 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -20,21 +20,18 @@ class MyApp extends StatelessWidget {
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepOrange),
useMaterial3: true,
),
- home: RepositoryProvider( //даём нашему репозиторию доступ
+ home: RepositoryProvider(
+ //даём нашему репозиторию доступ
lazy: true, //ленивое создание объекта
create: (_) => AgentsRepository(),
- child: BlocProvider( //даём доступ Bloc для нашей страницы
+ child: BlocProvider(
+ //даём доступ Bloc для нашей страницы
lazy: false,
- create: (context) => HomeBloc(context.read()), //в конструктор нашего Блока передаём репозиторий с нашей апи, то есть у нас появляется доступ по дереву к апи
+ create: (context) => HomeBloc(context.read<
+ AgentsRepository>()), //в конструктор нашего Блока передаём репозиторий с нашей апи, то есть у нас появляется доступ по дереву к апи
child: const MyHomePage(title: 'Агенты Valorant'),
),
),
);
}
}
-
-
-
-
-
-
diff --git a/lib/presentation/details_page/details_page.dart b/lib/presentation/details_page/details_page.dart
index ed46e57..d2df418 100644
--- a/lib/presentation/details_page/details_page.dart
+++ b/lib/presentation/details_page/details_page.dart
@@ -9,12 +9,15 @@ class DetailsPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
- appBar: AppBar(backgroundColor: Colors.deepPurple,
+ appBar: AppBar(
+ backgroundColor: Colors.deepPurple,
),
body: SingleChildScrollView(
child: Container(
- constraints: BoxConstraints( minHeight: MediaQuery.sizeOf(context).height - 105),
- decoration: const BoxDecoration(color: Colors.deepPurpleAccent,),
+ constraints: BoxConstraints(minHeight: MediaQuery.sizeOf(context).height - 105),
+ decoration: const BoxDecoration(
+ color: Colors.deepPurpleAccent,
+ ),
padding: const EdgeInsets.all(0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
@@ -40,4 +43,4 @@ class DetailsPage extends StatelessWidget {
),
);
}
-}
\ No newline at end of file
+}
diff --git a/lib/presentation/home_page/bloc/bloc.dart b/lib/presentation/home_page/bloc/bloc.dart
index 4b50176..ca8be37 100644
--- a/lib/presentation/home_page/bloc/bloc.dart
+++ b/lib/presentation/home_page/bloc/bloc.dart
@@ -3,28 +3,30 @@ import 'package:flutter_test_app/presentation/home_page/bloc/events.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../../../data/repositories/characters_repository.dart';
-class HomeBloc extends Bloc{//наследуем от Bloc и передаём состояния
+class HomeBloc extends Bloc {
+ //наследуем от Bloc и передаём состояния
final AgentsRepository rep;
HomeBloc(this.rep) : super(const HomeState()) {
on(_onLoadData);
}
- Future _onLoadData(
- HomeLoadDataEvent event, Emitter emit) async {
+ Future _onLoadData(HomeLoadDataEvent event, Emitter emit) async {
emit(state.copyWith(isLoading: true)); //метода emit изменяет наши состояния
String? error;
- final data = await rep.loadData( //загрузка данных
+ final data = await rep.loadData(
+ //загрузка данных
q: event.search,
onError: (e) => error = e,
);
- emit(state.copyWith( //метода emit изменяет наши состояния
+ emit(state.copyWith(
+ //метода emit изменяет наши состояния
isLoading: false, //флаг загрузки меняем на false
data: data,
error: error,
));
}
-}
\ No newline at end of file
+}
diff --git a/lib/presentation/home_page/bloc/events.dart b/lib/presentation/home_page/bloc/events.dart
index 70d3132..dc28622 100644
--- a/lib/presentation/home_page/bloc/events.dart
+++ b/lib/presentation/home_page/bloc/events.dart
@@ -1,9 +1,10 @@
-abstract class HomeEvent{ //наследуем все события
+abstract class HomeEvent {
+ //наследуем все события
const HomeEvent();
}
-class HomeLoadDataEvent extends HomeEvent{
+class HomeLoadDataEvent extends HomeEvent {
final String? search; //событие поиска
const HomeLoadDataEvent({this.search}); //событие на загрузку данных
-}
\ No newline at end of file
+}
diff --git a/lib/presentation/home_page/bloc/state.dart b/lib/presentation/home_page/bloc/state.dart
index fe51cd7..0a45d8b 100644
--- a/lib/presentation/home_page/bloc/state.dart
+++ b/lib/presentation/home_page/bloc/state.dart
@@ -3,7 +3,8 @@ import 'package:equatable/equatable.dart';
import '../../../domain/models/card.dart';
@CopyWith()
-class HomeState extends Equatable{ //сравнение двух состояний через Equatable
+class HomeState extends Equatable {
+ //сравнение двух состояний через Equatable
final List? data;
final bool isLoading; //отображение загрузки
final String? error; //отображение ошибок
@@ -14,7 +15,8 @@ class HomeState extends Equatable{ //сравнение двух состоян
this.error,
});
- HomeState copyWith({ //copyWith создаёт копию объекта с изменением некоторых данных
+ HomeState copyWith({
+ //copyWith создаёт копию объекта с изменением некоторых данных
List? data,
bool? isLoading,
String? error,
@@ -27,8 +29,8 @@ class HomeState extends Equatable{ //сравнение двух состоян
@override
List