From 386c3087b01df5f4dff8adda3ed6b166c378b046 Mon Sep 17 00:00:00 2001 From: revengel66 Date: Tue, 17 Dec 2024 17:19:10 +0400 Subject: [PATCH 1/8] begin --- lib/data/mappes/characters_mapper.dart | 2 +- lib/domain/models/card.dart | 8 ++++---- lib/presentation/details_page/details_page.dart | 4 ++-- lib/presentation/home_page/card.dart | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/data/mappes/characters_mapper.dart b/lib/data/mappes/characters_mapper.dart index e132916..5df1a2c 100644 --- a/lib/data/mappes/characters_mapper.dart +++ b/lib/data/mappes/characters_mapper.dart @@ -7,7 +7,7 @@ const _imagePlaceholder = 'https://cdn-icons-png.flaticon.com/512/4054/4054617.p extension CharacterDataDtoToModel on CharactersDataDto { CardData toDomain() => CardData( attributes?.name ?? 'UNKNOWN', - imgUrl: attributes?.image ?? _imagePlaceholder, + img: attributes?.image ?? _imagePlaceholder, description: _makeDescription(attributes?.born, attributes?.died), id: id, ); diff --git a/lib/domain/models/card.dart b/lib/domain/models/card.dart index 7b55800..894ee91 100644 --- a/lib/domain/models/card.dart +++ b/lib/domain/models/card.dart @@ -1,13 +1,13 @@ class CardData { - final String text; + final String name; final String description; - final String? imgUrl; + final String? img; final String? id; CardData( - this.text, { + this.name, { required this.description, - this.imgUrl, + this.img, this.id, }); } diff --git a/lib/presentation/details_page/details_page.dart b/lib/presentation/details_page/details_page.dart index ac6d191..c3ca0d7 100644 --- a/lib/presentation/details_page/details_page.dart +++ b/lib/presentation/details_page/details_page.dart @@ -16,13 +16,13 @@ class DetailsPage extends StatelessWidget { Padding( padding: const EdgeInsets.only(bottom: 16), child: Image.network( - data.imgUrl ?? '', + data.img ?? '', ), ), Padding( padding: const EdgeInsets.only(bottom: 4), child: Text( - data.text, + data.name, style: Theme.of(context).textTheme.headlineLarge, ), ), diff --git a/lib/presentation/home_page/card.dart b/lib/presentation/home_page/card.dart index 73c2ac8..b075943 100644 --- a/lib/presentation/home_page/card.dart +++ b/lib/presentation/home_page/card.dart @@ -28,9 +28,9 @@ class _Card extends StatelessWidget { bool isLiked = false, }) => _Card( - data.text, + data.name, description: data.description, - imgUrl: data.imgUrl, + imgUrl: data.img, onLike: onLike, onTap: onTap, isLiked: isLiked, From 63aa49af9d71f94547a76ff1013fe4a851a6cf3a Mon Sep 17 00:00:00 2001 From: revengel66 Date: Fri, 20 Dec 2024 14:49:52 +0400 Subject: [PATCH 2/8] in process --- lib/data/dtos/characters_dto.g.dart | 49 ------------------- .../{characters_dto.dart => titans_dto.dart} | 30 ++++-------- ...racters_mapper.dart => titans_mapper.dart} | 4 +- 3 files changed, 12 insertions(+), 71 deletions(-) delete mode 100644 lib/data/dtos/characters_dto.g.dart rename lib/data/dtos/{characters_dto.dart => titans_dto.dart} (58%) rename lib/data/mappes/{characters_mapper.dart => titans_mapper.dart} (89%) diff --git a/lib/data/dtos/characters_dto.g.dart b/lib/data/dtos/characters_dto.g.dart deleted file mode 100644 index 997f5d9..0000000 --- a/lib/data/dtos/characters_dto.g.dart +++ /dev/null @@ -1,49 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'characters_dto.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -CharactersDto _$CharactersDtoFromJson(Map json) => - CharactersDto( - data: (json['data'] as List?) - ?.map((e) => CharactersDataDto.fromJson(e as Map)) - .toList(), - meta: json['meta'] == null - ? null - : MetaDto.fromJson(json['meta'] as Map), - ); - -CharactersDataDto _$CharactersDataDtoFromJson(Map json) => - CharactersDataDto( - id: json['id'] as String?, - type: json['type'] as String?, - attributes: json['attributes'] == null - ? null - : CharasterAttributesDataDto.fromJson( - json['attributes'] as Map), - ); - -CharasterAttributesDataDto _$CharasterAttributesDataDtoFromJson( - Map json) => - CharasterAttributesDataDto( - name: json['name'] as String?, - born: json['born'] as String?, - died: json['died'] as String?, - image: json['image'] as String?, - ); - -MetaDto _$MetaDtoFromJson(Map json) => MetaDto( - pagination: json['pagination'] == null - ? null - : PaginationDto.fromJson(json['pagination'] as Map), - ); - -PaginationDto _$PaginationDtoFromJson(Map json) => - PaginationDto( - current: (json['current'] as num?)?.toInt(), - next: (json['next'] as num?)?.toInt(), - last: (json['last'] as num?)?.toInt(), - ); diff --git a/lib/data/dtos/characters_dto.dart b/lib/data/dtos/titans_dto.dart similarity index 58% rename from lib/data/dtos/characters_dto.dart rename to lib/data/dtos/titans_dto.dart index cf888e9..4a44657 100644 --- a/lib/data/dtos/characters_dto.dart +++ b/lib/data/dtos/titans_dto.dart @@ -4,41 +4,31 @@ part 'characters_dto.g.dart'; @JsonSerializable(createToJson: false) class CharactersDto { - final List? data; - final MetaDto? meta; - const CharactersDto({this.data, this.meta}); + final List? results; + final InfoDto? info; + const CharactersDto({this.results, this.info}); factory CharactersDto.fromJson(Map json) => _$CharactersDtoFromJson(json); } @JsonSerializable(createToJson: false) class CharactersDataDto { final String? id; - final String? type; - final CharasterAttributesDataDto? attributes; + final String? name; + final String? status; + final List species; + final String? age; const CharactersDataDto({this.id, this.type, this.attributes}); factory CharactersDataDto.fromJson(Map json) => _$CharactersDataDtoFromJson(json); } @JsonSerializable(createToJson: false) -class CharasterAttributesDataDto { - final String? name; - final String? born; - final String? died; - final String? image; - - const CharasterAttributesDataDto({this.name, this.born, this.died, this.image}); - factory CharasterAttributesDataDto.fromJson(Map json) => - _$CharasterAttributesDataDtoFromJson(json); -} - -@JsonSerializable(createToJson: false) -class MetaDto { +class InfoDto { final PaginationDto? pagination; - const MetaDto({this.pagination}); + const InfoDto({this.pagination}); - factory MetaDto.fromJson(Map json) => _$MetaDtoFromJson(json); + factory InfoDto.fromJson(Map json) => _$MetaDtoFromJson(json); } @JsonSerializable(createToJson: false) diff --git a/lib/data/mappes/characters_mapper.dart b/lib/data/mappes/titans_mapper.dart similarity index 89% rename from lib/data/mappes/characters_mapper.dart rename to lib/data/mappes/titans_mapper.dart index 5df1a2c..1d98608 100644 --- a/lib/data/mappes/characters_mapper.dart +++ b/lib/data/mappes/titans_mapper.dart @@ -24,7 +24,7 @@ extension CharacterDataDtoToModel on CharactersDataDto { extension CharactersDtoToModel on CharactersDto { HomeData toDomain() => HomeData( - data: data?.map((e) => e.toDomain()).toList(), - nextPage: meta?.pagination?.next, + data: results?.map((e) => e.toDomain()).toList(), + nextPage: info?.pagination?.next, ); } From 90808f51aab04c5098db9603b173c7ae1c7060d2 Mon Sep 17 00:00:00 2001 From: revengel66 Date: Fri, 20 Dec 2024 14:50:19 +0400 Subject: [PATCH 3/8] in process 2 --- lib/data/dtos/titans_dto.dart | 42 +++++++------------------ lib/data/mappes/titans_mapper.dart | 8 ++--- lib/repositories/potter_repository.dart | 4 +-- 3 files changed, 17 insertions(+), 37 deletions(-) diff --git a/lib/data/dtos/titans_dto.dart b/lib/data/dtos/titans_dto.dart index 4a44657..ac5f29c 100644 --- a/lib/data/dtos/titans_dto.dart +++ b/lib/data/dtos/titans_dto.dart @@ -1,43 +1,23 @@ import 'package:json_annotation/json_annotation.dart'; -part 'characters_dto.g.dart'; +part 'titans_dto.g.dart'; @JsonSerializable(createToJson: false) -class CharactersDto { - final List? results; +class TitansDto { + final List? results; final InfoDto? info; - const CharactersDto({this.results, this.info}); - factory CharactersDto.fromJson(Map json) => _$CharactersDtoFromJson(json); + const TitansDto({this.results, this.info}); + factory TitansDto.fromJson(Map json) => _$TitansDtoFromJson(json); } @JsonSerializable(createToJson: false) -class CharactersDataDto { +class TitansResultsDto { final String? id; final String? name; - final String? status; - final List species; - final String? age; - const CharactersDataDto({this.id, this.type, this.attributes}); - factory CharactersDataDto.fromJson(Map json) => + final String? height; + final List? abilities; + final String? allegiance; + const TitansResultsDto({this.id, this.name, this.height, this.abilities, this.allegiance}); + factory TitansResultsDto.fromJson(Map json) => _$CharactersDataDtoFromJson(json); } - -@JsonSerializable(createToJson: false) -class InfoDto { - final PaginationDto? pagination; - - const InfoDto({this.pagination}); - - factory InfoDto.fromJson(Map json) => _$MetaDtoFromJson(json); -} - -@JsonSerializable(createToJson: false) -class PaginationDto { - final int? current; - final int? next; - final int? last; - - const PaginationDto({this.current, this.next, this.last}); - - factory PaginationDto.fromJson(Map json) => _$PaginationDtoFromJson(json); -} diff --git a/lib/data/mappes/titans_mapper.dart b/lib/data/mappes/titans_mapper.dart index 1d98608..e622697 100644 --- a/lib/data/mappes/titans_mapper.dart +++ b/lib/data/mappes/titans_mapper.dart @@ -1,12 +1,12 @@ -import 'package:pmd_lab/data/dtos/characters_dto.dart'; +import 'package:pmd_lab/data/dtos/titans_dto.dart'; import 'package:pmd_lab/domain/models/card.dart'; import 'package:pmd_lab/domain/models/home.dart'; const _imagePlaceholder = 'https://cdn-icons-png.flaticon.com/512/4054/4054617.png'; -extension CharacterDataDtoToModel on CharactersDataDto { +extension CharacterDataDtoToModel on TitansResultsDto { CardData toDomain() => CardData( - attributes?.name ?? 'UNKNOWN', + name: ?.name ?? 'UNKNOWN', img: attributes?.image ?? _imagePlaceholder, description: _makeDescription(attributes?.born, attributes?.died), id: id, @@ -22,7 +22,7 @@ extension CharacterDataDtoToModel on CharactersDataDto { } } -extension CharactersDtoToModel on CharactersDto { +extension CharactersDtoToModel on TitansDto { HomeData toDomain() => HomeData( data: results?.map((e) => e.toDomain()).toList(), nextPage: info?.pagination?.next, diff --git a/lib/repositories/potter_repository.dart b/lib/repositories/potter_repository.dart index 1fc8960..0a2a024 100644 --- a/lib/repositories/potter_repository.dart +++ b/lib/repositories/potter_repository.dart @@ -1,5 +1,5 @@ import 'package:dio/dio.dart'; -import 'package:pmd_lab/data/dtos/characters_dto.dart'; +import 'package:pmd_lab/data/dtos/titans_dto.dart'; import 'package:pmd_lab/data/mappes/characters_mapper.dart'; import 'package:pmd_lab/domain/models/home.dart'; import 'package:pmd_lab/repositories/api_interface.dart'; @@ -33,7 +33,7 @@ class PotterRepository extends ApiInterface { }, ); - final CharactersDto dto = CharactersDto.fromJson(response.data as Map); + final TitansDto dto = TitansDto.fromJson(response.data as Map); final HomeData data = dto.toDomain(); return data; } on DioException catch (e) { From 302cbf28f43b653ce71d3eff3ddff8f77f5b492e Mon Sep 17 00:00:00 2001 From: revengel66 Date: Fri, 20 Dec 2024 16:08:42 +0400 Subject: [PATCH 4/8] not working --- lib/domain/models/home.dart | 8 ----- lib/repositories/mock_repository.dart | 29 ------------------- ...repository.dart => titans_repository.dart} | 4 +-- 3 files changed, 2 insertions(+), 39 deletions(-) delete mode 100644 lib/domain/models/home.dart rename lib/repositories/{potter_repository.dart => titans_repository.dart} (90%) diff --git a/lib/domain/models/home.dart b/lib/domain/models/home.dart deleted file mode 100644 index 2f0ba57..0000000 --- a/lib/domain/models/home.dart +++ /dev/null @@ -1,8 +0,0 @@ -import 'card.dart'; - -class HomeData { - final List? data; - final int? nextPage; - - HomeData({this.data, this.nextPage}); -} diff --git a/lib/repositories/mock_repository.dart b/lib/repositories/mock_repository.dart index 215da17..e69de29 100644 --- a/lib/repositories/mock_repository.dart +++ b/lib/repositories/mock_repository.dart @@ -1,29 +0,0 @@ -import 'package:pmd_lab/domain/models/home.dart'; -import 'package:pmd_lab/repositories/api_interface.dart'; - -class MockRepository extends ApiInterface { - @override - Future loadData({OnErrorCallback? onError}) async { - return HomeData(); - // return [ - // CardData( - // 'Какая-то новость', - // description: 'В данном блоке рекомендуем разместить краткую информацию', - // imgUrl: - // 'https://universal.revengel.ru/assets/cache_image/images/services/3_731x487_1cb.png', - // ), - // CardData( - // 'Ещё какая-то новость', - // description: 'В данном блоке рекомендуем разместить краткую информацию', - // imgUrl: - // "https://universal.revengel.ru/assets/cache_image/images/services/2_731x487_1cb.png", - // ), - // CardData( - // 'Ещё одна новость', - // description: 'В данном блоке рекомендуем разместить краткую информацию', - // imgUrl: - // "https://universal.revengel.ru/assets/cache_image/images/services/1_731x487_1cb.png", - // ) - //]; - } -} diff --git a/lib/repositories/potter_repository.dart b/lib/repositories/titans_repository.dart similarity index 90% rename from lib/repositories/potter_repository.dart rename to lib/repositories/titans_repository.dart index 0a2a024..898f790 100644 --- a/lib/repositories/potter_repository.dart +++ b/lib/repositories/titans_repository.dart @@ -1,6 +1,6 @@ import 'package:dio/dio.dart'; import 'package:pmd_lab/data/dtos/titans_dto.dart'; -import 'package:pmd_lab/data/mappes/characters_mapper.dart'; +import 'package:pmd_lab/data/mappes/titans_mapper.dart'; import 'package:pmd_lab/domain/models/home.dart'; import 'package:pmd_lab/repositories/api_interface.dart'; import 'package:pretty_dio_logger/pretty_dio_logger.dart'; @@ -12,7 +12,7 @@ class PotterRepository extends ApiInterface { requestBody: true, )); - static const String _baseUrl = 'https://api.potterdb.com'; + static const String _baseUrl = 'https://api.attackontitanapi.com'; @override Future loadData({ From c83f11ad7ca5c4cd4991f95e04c90aeafec632c3 Mon Sep 17 00:00:00 2001 From: revengel66 Date: Fri, 20 Dec 2024 16:09:01 +0400 Subject: [PATCH 5/8] not working:( --- Makefile | 5 --- lib/data/dtos/titans_dto.dart | 8 ++--- lib/data/dtos/titans_dto.g.dart | 25 ++++++++++++++ lib/data/mappes/titans_mapper.dart | 35 +++++++++----------- lib/main.dart | 8 ++--- lib/presentation/home_page/bloc/bloc.dart | 16 ++------- lib/presentation/home_page/bloc/state.dart | 11 ++---- lib/presentation/home_page/bloc/state.g.dart | 22 +++--------- lib/presentation/home_page/home_page.dart | 33 +++--------------- lib/repositories/api_interface.dart | 4 +-- lib/repositories/mock_repository.dart | 28 ++++++++++++++++ lib/repositories/titans_repository.dart | 24 +++++--------- 12 files changed, 102 insertions(+), 117 deletions(-) create mode 100644 lib/data/dtos/titans_dto.g.dart diff --git a/Makefile b/Makefile index bafc7ff..d707c25 100644 --- a/Makefile +++ b/Makefile @@ -4,11 +4,6 @@ gen: icon: flutter pub run flutter_launcher_icons:main -hello: - echo "Hi!"; \ - echo "I`m makefile"; \ - echo "^_^" - init_res: dart pub global activate flutter_asset_generator diff --git a/lib/data/dtos/titans_dto.dart b/lib/data/dtos/titans_dto.dart index ac5f29c..055b60f 100644 --- a/lib/data/dtos/titans_dto.dart +++ b/lib/data/dtos/titans_dto.dart @@ -5,8 +5,7 @@ part 'titans_dto.g.dart'; @JsonSerializable(createToJson: false) class TitansDto { final List? results; - final InfoDto? info; - const TitansDto({this.results, this.info}); + const TitansDto({this.results}); factory TitansDto.fromJson(Map json) => _$TitansDtoFromJson(json); } @@ -17,7 +16,8 @@ class TitansResultsDto { final String? height; final List? abilities; final String? allegiance; - const TitansResultsDto({this.id, this.name, this.height, this.abilities, this.allegiance}); + final String? image; + const TitansResultsDto({this.id, this.name, this.height, this.abilities, this.allegiance, this.image}); factory TitansResultsDto.fromJson(Map json) => - _$CharactersDataDtoFromJson(json); + _$TitansResultsDtoFromJson(json); } diff --git a/lib/data/dtos/titans_dto.g.dart b/lib/data/dtos/titans_dto.g.dart new file mode 100644 index 0000000..208fca5 --- /dev/null +++ b/lib/data/dtos/titans_dto.g.dart @@ -0,0 +1,25 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'titans_dto.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +TitansDto _$TitansDtoFromJson(Map json) => TitansDto( + results: (json['results'] as List?) + ?.map((e) => TitansResultsDto.fromJson(e as Map)) + .toList(), + ); + +TitansResultsDto _$TitansResultsDtoFromJson(Map json) => + TitansResultsDto( + id: json['id'] as String?, + name: json['name'] as String?, + height: json['height'] as String?, + abilities: (json['abilities'] as List?) + ?.map((e) => e as String) + .toList(), + allegiance: json['allegiance'] as String?, + image: json['image'] as String?, + ); diff --git a/lib/data/mappes/titans_mapper.dart b/lib/data/mappes/titans_mapper.dart index e622697..efe32fd 100644 --- a/lib/data/mappes/titans_mapper.dart +++ b/lib/data/mappes/titans_mapper.dart @@ -1,30 +1,27 @@ import 'package:pmd_lab/data/dtos/titans_dto.dart'; import 'package:pmd_lab/domain/models/card.dart'; -import 'package:pmd_lab/domain/models/home.dart'; const _imagePlaceholder = 'https://cdn-icons-png.flaticon.com/512/4054/4054617.png'; extension CharacterDataDtoToModel on TitansResultsDto { CardData toDomain() => CardData( - name: ?.name ?? 'UNKNOWN', - img: attributes?.image ?? _imagePlaceholder, - description: _makeDescription(attributes?.born, attributes?.died), + name ?? 'UNKNOWN', + img: image ?? _imagePlaceholder, + description: _makeDescription(height, abilities, allegiance), id: id, ); - String _makeDescription(String? born, String? died) { - return born != null && died != null - ? '$born - $died' - : born != null - ? 'born: $born' - : died != null - ? 'died: $died' - : ''; + String _makeDescription(String? height, List? abilities, String? allegiance) { + List descriptionParts = []; + if (height != null && height.isNotEmpty) { + descriptionParts.add('Height: $height'); + } + if (allegiance != null && allegiance.isNotEmpty) { + descriptionParts.add('Allegiance: $allegiance'); + } + if (abilities != null && abilities.isNotEmpty) { + final abilitiesStr = abilities.join(', '); + descriptionParts.add('Abilities: $abilitiesStr.'); + } + return descriptionParts.join('\n\n'); } } - -extension CharactersDtoToModel on TitansDto { - HomeData toDomain() => HomeData( - data: results?.map((e) => e.toDomain()).toList(), - nextPage: info?.pagination?.next, - ); -} diff --git a/lib/main.dart b/lib/main.dart index 6824431..c053a96 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -9,7 +9,7 @@ import 'package:pmd_lab/presentation/home_page/home_page.dart'; import 'package:pmd_lab/presentation/like_bloc/like_bloc.dart'; import 'package:pmd_lab/presentation/locale_bloc/locale_bloc.dart'; import 'package:pmd_lab/presentation/locale_bloc/locale_state.dart'; -import 'package:pmd_lab/repositories/potter_repository.dart'; +import 'package:pmd_lab/repositories/titans_repository.dart'; void main() { runApp(const MyApp()); @@ -35,15 +35,15 @@ class MyApp extends StatelessWidget { scaffoldBackgroundColor: Colors.white, useMaterial3: true, ), - home: RepositoryProvider( + home: RepositoryProvider( lazy: true, - create: (_) => PotterRepository(), + create: (_) => TitansRepository(), child: BlocProvider( lazy: false, create: (context) => LikeBloc(), child: BlocProvider( lazy: false, - create: (context) => HomeBloc(context.read()), + create: (context) => HomeBloc(context.read()), child: const MyHomePage(), ), ), diff --git a/lib/presentation/home_page/bloc/bloc.dart b/lib/presentation/home_page/bloc/bloc.dart index 9243871..1421bf7 100644 --- a/lib/presentation/home_page/bloc/bloc.dart +++ b/lib/presentation/home_page/bloc/bloc.dart @@ -1,37 +1,27 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:pmd_lab/presentation/home_page/bloc/events.dart'; import 'package:pmd_lab/presentation/home_page/bloc/state.dart'; -import 'package:pmd_lab/repositories/potter_repository.dart'; +import 'package:pmd_lab/repositories/titans_repository.dart'; class HomeBloc extends Bloc { - final PotterRepository repo; + final TitansRepository repo; HomeBloc(this.repo) : super(const HomeState()) { on(_onLoadData); } Future _onLoadData(HomeLoadDataEvent event, Emitter emit) async { - if (event.nextPage == null) { emit(state.copyWith(isLoading: true)); - } else { - emit(state.copyWith(isPaginationLoading: true)); - } String? error; - final data = await repo.loadData( + final data = await repo.loadResults( q: event.search, - page: event.nextPage ?? 1, onError: (e) => error = e, ); - if (event.nextPage != null) { - data?.data?.insertAll(0, state.data?.data ?? []); - } - emit(state.copyWith( isLoading: false, - isPaginationLoading: false, data: data, error: error, )); diff --git a/lib/presentation/home_page/bloc/state.dart b/lib/presentation/home_page/bloc/state.dart index 8b812ef..a66db73 100644 --- a/lib/presentation/home_page/bloc/state.dart +++ b/lib/presentation/home_page/bloc/state.dart @@ -1,33 +1,29 @@ import 'package:equatable/equatable.dart'; import 'package:copy_with_extension/copy_with_extension.dart'; -import 'package:pmd_lab/domain/models/home.dart'; +import 'package:pmd_lab/domain/models/card.dart'; part 'state.g.dart'; @CopyWith() class HomeState extends Equatable { - final HomeData? data; + final List? data; final bool isLoading; - final bool isPaginationLoading; final String? error; const HomeState({ this.data, this.isLoading = false, - this.isPaginationLoading = false, this.error, }); HomeState copyWith({ - HomeData? data, + List? data, bool? isLoading, - bool? isPaginationLoading, String? error, }) => HomeState( data: data ?? this.data, isLoading: isLoading ?? this.isLoading, - isPaginationLoading: isPaginationLoading ?? this.isPaginationLoading, error: error ?? this.error, ); @@ -35,7 +31,6 @@ class HomeState extends Equatable { List get props => [ data, isLoading, - isPaginationLoading, error, ]; } diff --git a/lib/presentation/home_page/bloc/state.g.dart b/lib/presentation/home_page/bloc/state.g.dart index 114ac25..c7f5b24 100644 --- a/lib/presentation/home_page/bloc/state.g.dart +++ b/lib/presentation/home_page/bloc/state.g.dart @@ -7,12 +7,10 @@ part of 'state.dart'; // ************************************************************************** abstract class _$HomeStateCWProxy { - HomeState data(HomeData? data); + HomeState data(List? data); HomeState isLoading(bool isLoading); - HomeState isPaginationLoading(bool isPaginationLoading); - HomeState error(String? error); /// This function **does support** nullification of nullable fields. All `null` values passed to `non-nullable` fields will be ignored. You can also use `HomeState(...).copyWith.fieldName(...)` to override fields one at a time with nullification support. @@ -22,9 +20,8 @@ abstract class _$HomeStateCWProxy { /// HomeState(...).copyWith(id: 12, name: "My name") /// ```` HomeState call({ - HomeData? data, + List? data, bool? isLoading, - bool? isPaginationLoading, String? error, }); } @@ -36,15 +33,11 @@ class _$HomeStateCWProxyImpl implements _$HomeStateCWProxy { final HomeState _value; @override - HomeState data(HomeData? data) => this(data: data); + HomeState data(List? data) => this(data: data); @override HomeState isLoading(bool isLoading) => this(isLoading: isLoading); - @override - HomeState isPaginationLoading(bool isPaginationLoading) => - this(isPaginationLoading: isPaginationLoading); - @override HomeState error(String? error) => this(error: error); @@ -59,24 +52,17 @@ class _$HomeStateCWProxyImpl implements _$HomeStateCWProxy { HomeState call({ Object? data = const $CopyWithPlaceholder(), Object? isLoading = const $CopyWithPlaceholder(), - Object? isPaginationLoading = const $CopyWithPlaceholder(), Object? error = const $CopyWithPlaceholder(), }) { return HomeState( data: data == const $CopyWithPlaceholder() ? _value.data // ignore: cast_nullable_to_non_nullable - : data as HomeData?, + : data as List?, isLoading: isLoading == const $CopyWithPlaceholder() || isLoading == null ? _value.isLoading // ignore: cast_nullable_to_non_nullable : isLoading as bool, - isPaginationLoading: - isPaginationLoading == const $CopyWithPlaceholder() || - isPaginationLoading == null - ? _value.isPaginationLoading - // ignore: cast_nullable_to_non_nullable - : isPaginationLoading as bool, error: error == const $CopyWithPlaceholder() ? _value.error // ignore: cast_nullable_to_non_nullable diff --git a/lib/presentation/home_page/home_page.dart b/lib/presentation/home_page/home_page.dart index 5fc0ca0..5f822f6 100644 --- a/lib/presentation/home_page/home_page.dart +++ b/lib/presentation/home_page/home_page.dart @@ -14,9 +14,7 @@ import 'package:pmd_lab/presentation/like_bloc/like_event.dart'; import 'package:pmd_lab/presentation/like_bloc/like_state.dart'; import 'package:pmd_lab/presentation/locale_bloc/locale_events.dart'; import 'package:pmd_lab/presentation/locale_bloc/locale_state.dart'; -import 'package:pmd_lab/repositories/api_interface.dart'; -import 'package:pmd_lab/repositories/potter_repository.dart'; - +import 'package:pmd_lab/repositories/titans_repository.dart'; import '../locale_bloc/locale_bloc.dart'; part 'card.dart'; @@ -41,37 +39,20 @@ class Body extends StatefulWidget { class _BodyState extends State { final searchController = TextEditingController(); - final scrollController = ScrollController(); - @override void initState() { SvgObjects.init(); - WidgetsBinding.instance.addPostFrameCallback((_) { context.read().add(const HomeLoadDataEvent()); context.read().add(const LoadLikesEvent()); }); - scrollController.addListener(_onNextPageListener); super.initState(); } - void _onNextPageListener() { - if (scrollController.offset > scrollController.position.maxScrollExtent) { - final bloc = context.read(); - if (!bloc.state.isPaginationLoading) { - bloc.add(HomeLoadDataEvent( - search: searchController.text, - nextPage: bloc.state.data?.nextPage, - )); - } - } - } @override void dispose() { searchController.dispose(); - scrollController.dispose(); - super.dispose(); } @@ -130,11 +111,10 @@ class _BodyState extends State { onRefresh: _onRefresh, child: ListView.builder( physics: const BouncingScrollPhysics(), - controller: scrollController, padding: EdgeInsets.zero, - itemCount: state.data?.data?.length ?? 0, + itemCount: state.data?.length ?? 0, itemBuilder: (context, index) { - final data = state.data?.data?[index]; + final data = state.data?[index]; return data != null ? _Card.fromData( data, @@ -150,12 +130,7 @@ class _BodyState extends State { ); }, ), // Expanded - ), // BlocBuilder - BlocBuilder( - builder: (context, state) => state.isPaginationLoading - ? const CircularProgressIndicator() - : const SizedBox.shrink(), - ) + ) // BlocBuilder ], ), ); diff --git a/lib/repositories/api_interface.dart b/lib/repositories/api_interface.dart index 6ec15d4..8ec2050 100644 --- a/lib/repositories/api_interface.dart +++ b/lib/repositories/api_interface.dart @@ -1,7 +1,7 @@ -import 'package:pmd_lab/domain/models/home.dart'; +import 'package:pmd_lab/domain/models/card.dart'; typedef OnErrorCallback = void Function(String? error); abstract class ApiInterface { - Future loadData({OnErrorCallback? onError}); + Future?> loadResults({OnErrorCallback? onError}); } diff --git a/lib/repositories/mock_repository.dart b/lib/repositories/mock_repository.dart index e69de29..bc83042 100644 --- a/lib/repositories/mock_repository.dart +++ b/lib/repositories/mock_repository.dart @@ -0,0 +1,28 @@ +import 'package:pmd_lab/domain/models/card.dart'; +import 'package:pmd_lab/repositories/api_interface.dart'; + +class MockRepository extends ApiInterface { + @override + Future?> loadData({OnErrorCallback? onError}) async { + return [ + CardData( + 'Freeze', + description: 'so cold..', + img: + 'https://www.skedaddlewildlife.com/wp-content/uploads/2018/09/depositphotos_22425309-stock-photo-a-lonely-raccoon-in-winter.jpg', + ), + CardData( + 'Hi', + description: 'pretty face', + img: + 'https://www.thesprucepets.com/thmb/nKNaS4I586B_H7sEUw9QAXvWM_0=/2121x0/filters:no_upscale():strip_icc()/GettyImages-135630198-5ba7d225c9e77c0050cff91b.jpg', + ), + CardData( + 'Orange', + description: 'I like autumn', + img: 'https://furmanagers.com/wp-content/uploads/2019/11/dreamstime_l_22075357.jpg', + ), + ]; + } + +} \ No newline at end of file diff --git a/lib/repositories/titans_repository.dart b/lib/repositories/titans_repository.dart index 898f790..8ee52b0 100644 --- a/lib/repositories/titans_repository.dart +++ b/lib/repositories/titans_repository.dart @@ -1,11 +1,11 @@ import 'package:dio/dio.dart'; import 'package:pmd_lab/data/dtos/titans_dto.dart'; import 'package:pmd_lab/data/mappes/titans_mapper.dart'; -import 'package:pmd_lab/domain/models/home.dart'; +import 'package:pmd_lab/domain/models/card.dart'; import 'package:pmd_lab/repositories/api_interface.dart'; import 'package:pretty_dio_logger/pretty_dio_logger.dart'; -class PotterRepository extends ApiInterface { +class TitansRepository extends ApiInterface { static final Dio _dio = Dio() ..interceptors.add(PrettyDioLogger( requestHeader: true, @@ -15,28 +15,22 @@ class PotterRepository extends ApiInterface { static const String _baseUrl = 'https://api.attackontitanapi.com'; @override - Future loadData({ + Future?> loadResults({ OnErrorCallback? onError, - String? q, - int page = 1, - int pageSize = 25, + String? q }) async { try { - const String url = '$_baseUrl/v1/characters'; + const String url = '$_baseUrl/titans'; final Response response = await _dio.get>( url, - queryParameters: { - 'filter[name_cont]': q, - 'page[number]': page, - 'page[size]': pageSize, - }, + queryParameters: q != null ? {'filter[name_cont]': q} : null, ); final TitansDto dto = TitansDto.fromJson(response.data as Map); - final HomeData data = dto.toDomain(); - return data; - } on DioException catch (e) { + final List? results = dto.results?.map((e) => e.toDomain()).toList(); + return results; + } on DioException catch (e) { onError?.call(e.error?.toString()); return null; } From bebc4de8afb7a1e5308d8dccba4a5bccc98bee1e Mon Sep 17 00:00:00 2001 From: revengel66 Date: Fri, 20 Dec 2024 18:13:20 +0400 Subject: [PATCH 6/8] =?UTF-8?q?=D0=A3=D0=A0=D0=90!=20=D0=93=D0=9E=D0=A2?= =?UTF-8?q?=D0=9E=D0=92=D0=9E!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/dtos/titans_dto.dart | 6 +- lib/data/dtos/titans_dto.g.dart | 4 +- lib/data/mappes/titans_mapper.dart | 6 +- lib/main.dart | 4 +- .../details_page/details_page.dart | 64 ++++++++++++++----- lib/presentation/home_page/bloc/bloc.dart | 2 + lib/presentation/home_page/card.dart | 19 +++--- lib/presentation/home_page/home_page.dart | 13 +++- lib/repositories/mock_repository.dart | 2 +- lib/repositories/titans_repository.dart | 2 +- 10 files changed, 81 insertions(+), 41 deletions(-) diff --git a/lib/data/dtos/titans_dto.dart b/lib/data/dtos/titans_dto.dart index 055b60f..de98a4c 100644 --- a/lib/data/dtos/titans_dto.dart +++ b/lib/data/dtos/titans_dto.dart @@ -11,13 +11,13 @@ class TitansDto { @JsonSerializable(createToJson: false) class TitansResultsDto { - final String? id; + final int? id; final String? name; final String? height; final List? abilities; final String? allegiance; - final String? image; - const TitansResultsDto({this.id, this.name, this.height, this.abilities, this.allegiance, this.image}); + final String? img; + const TitansResultsDto({this.id, this.name, this.height, this.abilities, this.allegiance, this.img}); factory TitansResultsDto.fromJson(Map json) => _$TitansResultsDtoFromJson(json); } diff --git a/lib/data/dtos/titans_dto.g.dart b/lib/data/dtos/titans_dto.g.dart index 208fca5..ea5ab94 100644 --- a/lib/data/dtos/titans_dto.g.dart +++ b/lib/data/dtos/titans_dto.g.dart @@ -14,12 +14,12 @@ TitansDto _$TitansDtoFromJson(Map json) => TitansDto( TitansResultsDto _$TitansResultsDtoFromJson(Map json) => TitansResultsDto( - id: json['id'] as String?, + id: (json['id'] as num?)?.toInt(), name: json['name'] as String?, height: json['height'] as String?, abilities: (json['abilities'] as List?) ?.map((e) => e as String) .toList(), allegiance: json['allegiance'] as String?, - image: json['image'] as String?, + img: json['img'] as String?, ); diff --git a/lib/data/mappes/titans_mapper.dart b/lib/data/mappes/titans_mapper.dart index efe32fd..d034bfd 100644 --- a/lib/data/mappes/titans_mapper.dart +++ b/lib/data/mappes/titans_mapper.dart @@ -6,9 +6,9 @@ const _imagePlaceholder = 'https://cdn-icons-png.flaticon.com/512/4054/4054617.p extension CharacterDataDtoToModel on TitansResultsDto { CardData toDomain() => CardData( name ?? 'UNKNOWN', - img: image ?? _imagePlaceholder, + img: img ?? _imagePlaceholder, description: _makeDescription(height, abilities, allegiance), - id: id, + id: id.toString(), ); String _makeDescription(String? height, List? abilities, String? allegiance) { List descriptionParts = []; @@ -22,6 +22,6 @@ extension CharacterDataDtoToModel on TitansResultsDto { final abilitiesStr = abilities.join(', '); descriptionParts.add('Abilities: $abilitiesStr.'); } - return descriptionParts.join('\n\n'); + return descriptionParts.join('\n'); } } diff --git a/lib/main.dart b/lib/main.dart index c053a96..6b9a082 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -9,6 +9,7 @@ import 'package:pmd_lab/presentation/home_page/home_page.dart'; import 'package:pmd_lab/presentation/like_bloc/like_bloc.dart'; import 'package:pmd_lab/presentation/locale_bloc/locale_bloc.dart'; import 'package:pmd_lab/presentation/locale_bloc/locale_state.dart'; +import 'package:pmd_lab/repositories/mock_repository.dart'; import 'package:pmd_lab/repositories/titans_repository.dart'; void main() { @@ -26,13 +27,12 @@ class MyApp extends StatelessWidget { child: BlocBuilder( builder: (context, state) { return MaterialApp( - title: 'Potter App', locale: state.currentLocale, localizationsDelegates: AppLocale.localizationsDelegates, supportedLocales: AppLocale.supportedLocales, theme: ThemeData( primarySwatch: Colors.orange, - scaffoldBackgroundColor: Colors.white, + scaffoldBackgroundColor: Color(0x33BDBCBC), useMaterial3: true, ), home: RepositoryProvider( diff --git a/lib/presentation/details_page/details_page.dart b/lib/presentation/details_page/details_page.dart index c3ca0d7..fa61c11 100644 --- a/lib/presentation/details_page/details_page.dart +++ b/lib/presentation/details_page/details_page.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:pmd_lab/domain/models/card.dart'; class DetailsPage extends StatelessWidget { @@ -9,28 +10,59 @@ class DetailsPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(), + backgroundColor: Color(0xFF272727), + appBar: AppBar( + backgroundColor: const Color(0xFF272727), // Тёмный фон AppBar + iconTheme: const IconThemeData( + color: Colors.white, + ), + title: const Text( + 'Детальная страница', + style: TextStyle( + color: Colors.white, + ), + ), + elevation: 0, + systemOverlayStyle: SystemUiOverlayStyle.light, + ), body: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Padding( - padding: const EdgeInsets.only(bottom: 16), - child: Image.network( - data.img ?? '', + Stack(children: [ + ClipRRect( + child: Image.network( + data.img ?? '', + errorBuilder: (_, __, ___) => const Placeholder(), + height: 370, + alignment: Alignment.topCenter, + fit: BoxFit.cover, + width: double.infinity, + ), + ), + ]), + Padding( + padding: const EdgeInsets.only(bottom: 4, top: 16, right: 20, left: 20), + child: Text( + data.name, + style: const TextStyle( + color: Colors.white70, + fontSize: 30, + fontWeight: FontWeight.bold, + ), + ), ), - ), - Padding( - padding: const EdgeInsets.only(bottom: 4), + Padding( + padding: const EdgeInsets.only(bottom: 4, top: 16, right: 20, left: 20), child: Text( - data.name, - style: Theme.of(context).textTheme.headlineLarge, + data.description, + style: const TextStyle( + color: Colors.white70, + fontSize: 20, + fontWeight: FontWeight.normal, + ), ), - ), - Text( - data.description, - style: Theme.of(context).textTheme.bodyLarge, ) - ], - )); + ]) + ); } } diff --git a/lib/presentation/home_page/bloc/bloc.dart b/lib/presentation/home_page/bloc/bloc.dart index 1421bf7..d20560b 100644 --- a/lib/presentation/home_page/bloc/bloc.dart +++ b/lib/presentation/home_page/bloc/bloc.dart @@ -1,6 +1,8 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:pmd_lab/presentation/home_page/bloc/events.dart'; import 'package:pmd_lab/presentation/home_page/bloc/state.dart'; +import 'package:pmd_lab/repositories/api_interface.dart'; +import 'package:pmd_lab/repositories/mock_repository.dart'; import 'package:pmd_lab/repositories/titans_repository.dart'; class HomeBloc extends Bloc { diff --git a/lib/presentation/home_page/card.dart b/lib/presentation/home_page/card.dart index b075943..1d722bd 100644 --- a/lib/presentation/home_page/card.dart +++ b/lib/presentation/home_page/card.dart @@ -44,14 +44,12 @@ class _Card extends StatelessWidget { child: Container( margin: const EdgeInsets.only(bottom: 20), decoration: - BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20), boxShadow: [ - BoxShadow( - color: Colors.black.withOpacity(0.1), - spreadRadius: 1, - offset: const Offset(0, 0), - blurRadius: 15, - ) - ]), + BoxDecoration(color: Color(0xFF272727), borderRadius: BorderRadius.circular(20), + border: Border.all( // Задаем рамку + color: Colors.white12, // Цвет рамки + width: 2, // Толщина рамки + ), + ), child: Column(crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Stack(children: [ ClipRRect( @@ -77,7 +75,7 @@ class _Card extends StatelessWidget { child: Text( text, style: const TextStyle( - color: Color(0xff4c4c4c), + color: Colors.white70, fontSize: 30, fontWeight: FontWeight.bold, ), @@ -86,7 +84,7 @@ class _Card extends StatelessWidget { Text( description, style: const TextStyle( - color: Color(0xff9c9c9c), + color: Colors.white70, fontSize: 20, fontWeight: FontWeight.normal, ), @@ -105,6 +103,7 @@ class _Card extends StatelessWidget { ) : const Icon( Icons.favorite_border, + color: Colors.white, key: ValueKey(1), ), ), diff --git a/lib/presentation/home_page/home_page.dart b/lib/presentation/home_page/home_page.dart index 5f822f6..8a8c5d4 100644 --- a/lib/presentation/home_page/home_page.dart +++ b/lib/presentation/home_page/home_page.dart @@ -71,6 +71,13 @@ class _BodyState extends State { child: CupertinoSearchTextField( controller: searchController, placeholder: context.locale.search, + backgroundColor: Colors.white12, + placeholderStyle: TextStyle( + color: Colors.white, // Задайте желаемый цвет плейсхолдера// (Необязательно) Задайте размер шрифта(Необязательно) Задайте стиль шрифта + ), + style: TextStyle( + color: Colors.white, + ), onChanged: (search) { Debounce.run(() => context.read().add(HomeLoadDataEvent(search: search))); }, @@ -111,7 +118,7 @@ class _BodyState extends State { onRefresh: _onRefresh, child: ListView.builder( physics: const BouncingScrollPhysics(), - padding: EdgeInsets.zero, + padding: const EdgeInsets.all(12), itemCount: state.data?.length ?? 0, itemBuilder: (context, index) { final data = state.data?[index]; @@ -143,7 +150,7 @@ class _BodyState extends State { '$title ${isLiked ? context.locale.liked : context.locale.disliked}', style: Theme.of(context).textTheme.bodyLarge, ), - backgroundColor: Colors.orangeAccent, + backgroundColor: Colors.white, duration: const Duration(seconds: 1), )); }); @@ -163,7 +170,7 @@ class _BodyState extends State { void _onLike(String? id, String title, bool isLiked) { if (id != null) { - context.read().add(ChangeLikeEvent(id)); + context.read().add(ChangeLikeEvent(id.toString())); _showSnackBar(context, title, !isLiked); } } diff --git a/lib/repositories/mock_repository.dart b/lib/repositories/mock_repository.dart index bc83042..8d1504a 100644 --- a/lib/repositories/mock_repository.dart +++ b/lib/repositories/mock_repository.dart @@ -3,7 +3,7 @@ import 'package:pmd_lab/repositories/api_interface.dart'; class MockRepository extends ApiInterface { @override - Future?> loadData({OnErrorCallback? onError}) async { + Future?> loadResults({OnErrorCallback? onError, String? q}) async { return [ CardData( 'Freeze', diff --git a/lib/repositories/titans_repository.dart b/lib/repositories/titans_repository.dart index 8ee52b0..94c288b 100644 --- a/lib/repositories/titans_repository.dart +++ b/lib/repositories/titans_repository.dart @@ -24,7 +24,7 @@ class TitansRepository extends ApiInterface { final Response response = await _dio.get>( url, - queryParameters: q != null ? {'filter[name_cont]': q} : null, + queryParameters: q != null ? {'name': q} : null, ); final TitansDto dto = TitansDto.fromJson(response.data as Map); From 8f6581ae98f45d196e3bf095aecb08c6fb902dee Mon Sep 17 00:00:00 2001 From: revengel66 Date: Fri, 20 Dec 2024 20:49:02 +0400 Subject: [PATCH 7/8] =?UTF-8?q?add=20HomeData.=20=D0=A2=D0=B5=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D1=8C=20=D1=82=D0=BE=D1=87=D0=BD=D0=BE=20=D0=B2=D1=81?= =?UTF-8?q?=D1=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/mappes/titans_mapper.dart | 9 ++++++- lib/domain/models/home.dart | 7 +++++ lib/main.dart | 2 +- lib/presentation/home_page/bloc/bloc.dart | 2 -- lib/presentation/home_page/bloc/events.dart | 3 +-- lib/presentation/home_page/bloc/state.dart | 5 ++-- lib/presentation/home_page/bloc/state.g.dart | 8 +++--- lib/presentation/home_page/home_page.dart | 4 +-- lib/repositories/api_interface.dart | 3 ++- lib/repositories/mock_repository.dart | 28 -------------------- lib/repositories/titans_repository.dart | 7 ++--- 11 files changed, 32 insertions(+), 46 deletions(-) create mode 100644 lib/domain/models/home.dart delete mode 100644 lib/repositories/mock_repository.dart diff --git a/lib/data/mappes/titans_mapper.dart b/lib/data/mappes/titans_mapper.dart index d034bfd..9fb2a2e 100644 --- a/lib/data/mappes/titans_mapper.dart +++ b/lib/data/mappes/titans_mapper.dart @@ -1,9 +1,16 @@ import 'package:pmd_lab/data/dtos/titans_dto.dart'; import 'package:pmd_lab/domain/models/card.dart'; +import 'package:pmd_lab/domain/models/home.dart'; const _imagePlaceholder = 'https://cdn-icons-png.flaticon.com/512/4054/4054617.png'; -extension CharacterDataDtoToModel on TitansResultsDto { +extension TitansDtoToModel on TitansDto { + HomeData toDomain() => HomeData( + data: results?.map((e) => e.toDomain()).toList(), + ); +} + +extension TitanResultsDtoToModel on TitansResultsDto { CardData toDomain() => CardData( name ?? 'UNKNOWN', img: img ?? _imagePlaceholder, diff --git a/lib/domain/models/home.dart b/lib/domain/models/home.dart new file mode 100644 index 0000000..f5a7b16 --- /dev/null +++ b/lib/domain/models/home.dart @@ -0,0 +1,7 @@ +import 'package:pmd_lab/domain/models/card.dart'; + +class HomeData { + final List? data; + + HomeData({this.data}); +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 6b9a082..9062809 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -9,7 +9,6 @@ import 'package:pmd_lab/presentation/home_page/home_page.dart'; import 'package:pmd_lab/presentation/like_bloc/like_bloc.dart'; import 'package:pmd_lab/presentation/locale_bloc/locale_bloc.dart'; import 'package:pmd_lab/presentation/locale_bloc/locale_state.dart'; -import 'package:pmd_lab/repositories/mock_repository.dart'; import 'package:pmd_lab/repositories/titans_repository.dart'; void main() { @@ -30,6 +29,7 @@ class MyApp extends StatelessWidget { locale: state.currentLocale, localizationsDelegates: AppLocale.localizationsDelegates, supportedLocales: AppLocale.supportedLocales, + debugShowCheckedModeBanner: false, theme: ThemeData( primarySwatch: Colors.orange, scaffoldBackgroundColor: Color(0x33BDBCBC), diff --git a/lib/presentation/home_page/bloc/bloc.dart b/lib/presentation/home_page/bloc/bloc.dart index d20560b..1421bf7 100644 --- a/lib/presentation/home_page/bloc/bloc.dart +++ b/lib/presentation/home_page/bloc/bloc.dart @@ -1,8 +1,6 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:pmd_lab/presentation/home_page/bloc/events.dart'; import 'package:pmd_lab/presentation/home_page/bloc/state.dart'; -import 'package:pmd_lab/repositories/api_interface.dart'; -import 'package:pmd_lab/repositories/mock_repository.dart'; import 'package:pmd_lab/repositories/titans_repository.dart'; class HomeBloc extends Bloc { diff --git a/lib/presentation/home_page/bloc/events.dart b/lib/presentation/home_page/bloc/events.dart index b1cff65..dfa00fa 100644 --- a/lib/presentation/home_page/bloc/events.dart +++ b/lib/presentation/home_page/bloc/events.dart @@ -4,6 +4,5 @@ class HomeEvent { class HomeLoadDataEvent extends HomeEvent { final String? search; - final int? nextPage; - const HomeLoadDataEvent({this.search, this.nextPage}); + const HomeLoadDataEvent({this.search}); } diff --git a/lib/presentation/home_page/bloc/state.dart b/lib/presentation/home_page/bloc/state.dart index a66db73..1cbab4b 100644 --- a/lib/presentation/home_page/bloc/state.dart +++ b/lib/presentation/home_page/bloc/state.dart @@ -1,12 +1,13 @@ import 'package:equatable/equatable.dart'; import 'package:copy_with_extension/copy_with_extension.dart'; import 'package:pmd_lab/domain/models/card.dart'; +import 'package:pmd_lab/domain/models/home.dart'; part 'state.g.dart'; @CopyWith() class HomeState extends Equatable { - final List? data; + final HomeData? data; final bool isLoading; final String? error; @@ -17,7 +18,7 @@ class HomeState extends Equatable { }); HomeState copyWith({ - List? data, + HomeData? data, bool? isLoading, String? error, }) => diff --git a/lib/presentation/home_page/bloc/state.g.dart b/lib/presentation/home_page/bloc/state.g.dart index c7f5b24..e43293e 100644 --- a/lib/presentation/home_page/bloc/state.g.dart +++ b/lib/presentation/home_page/bloc/state.g.dart @@ -7,7 +7,7 @@ part of 'state.dart'; // ************************************************************************** abstract class _$HomeStateCWProxy { - HomeState data(List? data); + HomeState data(HomeData? data); HomeState isLoading(bool isLoading); @@ -20,7 +20,7 @@ abstract class _$HomeStateCWProxy { /// HomeState(...).copyWith(id: 12, name: "My name") /// ```` HomeState call({ - List? data, + HomeData? data, bool? isLoading, String? error, }); @@ -33,7 +33,7 @@ class _$HomeStateCWProxyImpl implements _$HomeStateCWProxy { final HomeState _value; @override - HomeState data(List? data) => this(data: data); + HomeState data(HomeData? data) => this(data: data); @override HomeState isLoading(bool isLoading) => this(isLoading: isLoading); @@ -58,7 +58,7 @@ class _$HomeStateCWProxyImpl implements _$HomeStateCWProxy { data: data == const $CopyWithPlaceholder() ? _value.data // ignore: cast_nullable_to_non_nullable - : data as List?, + : data as HomeData?, isLoading: isLoading == const $CopyWithPlaceholder() || isLoading == null ? _value.isLoading // ignore: cast_nullable_to_non_nullable diff --git a/lib/presentation/home_page/home_page.dart b/lib/presentation/home_page/home_page.dart index 8a8c5d4..32aa13b 100644 --- a/lib/presentation/home_page/home_page.dart +++ b/lib/presentation/home_page/home_page.dart @@ -119,9 +119,9 @@ class _BodyState extends State { child: ListView.builder( physics: const BouncingScrollPhysics(), padding: const EdgeInsets.all(12), - itemCount: state.data?.length ?? 0, + itemCount: state.data?.data?.length ?? 0, itemBuilder: (context, index) { - final data = state.data?[index]; + final data = state.data?.data?[index]; return data != null ? _Card.fromData( data, diff --git a/lib/repositories/api_interface.dart b/lib/repositories/api_interface.dart index 8ec2050..1baca13 100644 --- a/lib/repositories/api_interface.dart +++ b/lib/repositories/api_interface.dart @@ -1,7 +1,8 @@ import 'package:pmd_lab/domain/models/card.dart'; +import 'package:pmd_lab/domain/models/home.dart'; typedef OnErrorCallback = void Function(String? error); abstract class ApiInterface { - Future?> loadResults({OnErrorCallback? onError}); + Future loadResults({OnErrorCallback? onError}); } diff --git a/lib/repositories/mock_repository.dart b/lib/repositories/mock_repository.dart deleted file mode 100644 index 8d1504a..0000000 --- a/lib/repositories/mock_repository.dart +++ /dev/null @@ -1,28 +0,0 @@ -import 'package:pmd_lab/domain/models/card.dart'; -import 'package:pmd_lab/repositories/api_interface.dart'; - -class MockRepository extends ApiInterface { - @override - Future?> loadResults({OnErrorCallback? onError, String? q}) async { - return [ - CardData( - 'Freeze', - description: 'so cold..', - img: - 'https://www.skedaddlewildlife.com/wp-content/uploads/2018/09/depositphotos_22425309-stock-photo-a-lonely-raccoon-in-winter.jpg', - ), - CardData( - 'Hi', - description: 'pretty face', - img: - 'https://www.thesprucepets.com/thmb/nKNaS4I586B_H7sEUw9QAXvWM_0=/2121x0/filters:no_upscale():strip_icc()/GettyImages-135630198-5ba7d225c9e77c0050cff91b.jpg', - ), - CardData( - 'Orange', - description: 'I like autumn', - img: 'https://furmanagers.com/wp-content/uploads/2019/11/dreamstime_l_22075357.jpg', - ), - ]; - } - -} \ No newline at end of file diff --git a/lib/repositories/titans_repository.dart b/lib/repositories/titans_repository.dart index 94c288b..5125494 100644 --- a/lib/repositories/titans_repository.dart +++ b/lib/repositories/titans_repository.dart @@ -2,6 +2,7 @@ import 'package:dio/dio.dart'; import 'package:pmd_lab/data/dtos/titans_dto.dart'; import 'package:pmd_lab/data/mappes/titans_mapper.dart'; import 'package:pmd_lab/domain/models/card.dart'; +import 'package:pmd_lab/domain/models/home.dart'; import 'package:pmd_lab/repositories/api_interface.dart'; import 'package:pretty_dio_logger/pretty_dio_logger.dart'; @@ -15,7 +16,7 @@ class TitansRepository extends ApiInterface { static const String _baseUrl = 'https://api.attackontitanapi.com'; @override - Future?> loadResults({ + Future loadResults({ OnErrorCallback? onError, String? q }) async { @@ -28,8 +29,8 @@ class TitansRepository extends ApiInterface { ); final TitansDto dto = TitansDto.fromJson(response.data as Map); - final List? results = dto.results?.map((e) => e.toDomain()).toList(); - return results; + final HomeData data = dto.toDomain(); + return data; } on DioException catch (e) { onError?.call(e.error?.toString()); return null; From a34d3135091790d3782aee015c0c8f7668610da6 Mon Sep 17 00:00:00 2001 From: revengel66 Date: Sat, 21 Dec 2024 02:47:21 +0400 Subject: [PATCH 8/8] =?UTF-8?q?=D0=BC=D0=B5=D0=BB=D0=BA=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/domain/models/card.dart | 4 ++-- lib/presentation/details_page/details_page.dart | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/domain/models/card.dart b/lib/domain/models/card.dart index 894ee91..9d3c012 100644 --- a/lib/domain/models/card.dart +++ b/lib/domain/models/card.dart @@ -2,12 +2,12 @@ class CardData { final String name; final String description; final String? img; - final String? id; + final String id; CardData( this.name, { required this.description, this.img, - this.id, + required this.id, }); } diff --git a/lib/presentation/details_page/details_page.dart b/lib/presentation/details_page/details_page.dart index fa61c11..5b6826e 100644 --- a/lib/presentation/details_page/details_page.dart +++ b/lib/presentation/details_page/details_page.dart @@ -16,8 +16,8 @@ class DetailsPage extends StatelessWidget { iconTheme: const IconThemeData( color: Colors.white, ), - title: const Text( - 'Детальная страница', + title: Text( + data.name, style: TextStyle( color: Colors.white, ),