From cea1545b9ae442d015ecdfd67f49e7a9ad8a39ec Mon Sep 17 00:00:00 2001 From: elena Date: Sat, 21 Dec 2024 14:59:36 +0400 Subject: [PATCH] kursovaya with error --- devtools_options.yaml | 3 + lib/data/dtos/characters_dto.dart | 60 ------------------- lib/data/dtos/characters_dto.g.dart | 42 ------------- lib/data/dtos/games_dto.dart | 60 +++++++++++++++++++ lib/data/dtos/games_dto.g.dart | 47 +++++++++++++++ lib/data/mappers/characters_mapper.dart | 32 ---------- lib/data/mappers/games_mapper.dart | 26 ++++++++ ...r_repository.dart => game_repository.dart} | 19 +++--- lib/domain/models/card.dart | 1 + lib/main.dart | 8 +-- lib/presentation/home_page/bloc/bloc.dart | 6 +- lib/presentation/home_page/bloc/state.g.dart | 15 ++--- lib/presentation/like_bloc/like_state.g.dart | 2 +- .../locale_bloc/locale_state.g.dart | 12 ++-- 14 files changed, 169 insertions(+), 164 deletions(-) create mode 100644 devtools_options.yaml delete mode 100644 lib/data/dtos/characters_dto.dart delete mode 100644 lib/data/dtos/characters_dto.g.dart create mode 100644 lib/data/dtos/games_dto.dart create mode 100644 lib/data/dtos/games_dto.g.dart delete mode 100644 lib/data/mappers/characters_mapper.dart create mode 100644 lib/data/mappers/games_mapper.dart rename lib/data/repositories/{potter_repository.dart => game_repository.dart} (61%) diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 0000000..fa0b357 --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/lib/data/dtos/characters_dto.dart b/lib/data/dtos/characters_dto.dart deleted file mode 100644 index 2bccf76..0000000 --- a/lib/data/dtos/characters_dto.dart +++ /dev/null @@ -1,60 +0,0 @@ -import 'package:json_annotation/json_annotation.dart'; - -part 'characters_dto.g.dart'; - -@JsonSerializable(createToJson: false) -class CharactersDto { - final List? data; - final MetaDto? meta; - - const CharactersDto({ - this.data, - this.meta, - }); - - factory CharactersDto.fromJson(Map json) => _$CharactersDtoFromJson(json); -} - -@JsonSerializable(createToJson: false) -class CharacterDataDto { - final String? id; - final String? type; - final CharacterAttributesDataDto? attributes; - - const CharacterDataDto({this.id, this.type, this.attributes}); - - factory CharacterDataDto.fromJson(Map json) => _$CharacterDataDtoFromJson(json); -} - -@JsonSerializable(createToJson: false) -class CharacterAttributesDataDto { - final String? name; - final String? born; - final String? died; - final String? image; - - const CharacterAttributesDataDto({this.name, this.born, this.died, this.image}); - - factory CharacterAttributesDataDto.fromJson(Map json) => - _$CharacterAttributesDataDtoFromJson(json); -} - -@JsonSerializable(createToJson: false) -class MetaDto { - final PaginationDto? pagination; - - const MetaDto({this.pagination}); - - factory MetaDto.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/dtos/characters_dto.g.dart b/lib/data/dtos/characters_dto.g.dart deleted file mode 100644 index ca7a4b4..0000000 --- a/lib/data/dtos/characters_dto.g.dart +++ /dev/null @@ -1,42 +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) => CharacterDataDto.fromJson(e as Map)) - .toList(), - meta: json['meta'] == null ? null : MetaDto.fromJson(json['meta'] as Map), -); - -CharacterDataDto _$CharacterDataDtoFromJson(Map json) => CharacterDataDto( - id: json['id'] as String?, - type: json['type'] as String?, - attributes: json['attributes'] == null - ? null - : CharacterAttributesDataDto.fromJson(json['attributes'] as Map), -); - -CharacterAttributesDataDto _$CharacterAttributesDataDtoFromJson(Map json) => - CharacterAttributesDataDto( - 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 int?, - next: json['next'] as int?, - last: json['last'] as int?, -); diff --git a/lib/data/dtos/games_dto.dart b/lib/data/dtos/games_dto.dart new file mode 100644 index 0000000..6bc1128 --- /dev/null +++ b/lib/data/dtos/games_dto.dart @@ -0,0 +1,60 @@ +import 'package:json_annotation/json_annotation.dart'; + +part 'games_dto.g.dart'; + +@JsonSerializable(createToJson: false) +class GamesDto { + final List? data; + final MetaDto? meta; + + const GamesDto({ + this.data, + this.meta, + }); + + factory GamesDto.fromJson(Map json) => _$GamesDtoFromJson(json); +} + +@JsonSerializable(createToJson: false) +class GameDataDto { + final String? id; + final List? attributes; + + const GameDataDto({this.id, this.attributes}); + + factory GameDataDto.fromJson(Map json) => _$GameDataDtoFromJson(json); +} + +@JsonSerializable(createToJson: false) +class GameAttributesDataDto { + final String? alias; + final String? descriptionShort; + final String? description; + final String? photoUrl; + final String? year; + + const GameAttributesDataDto({this.alias, this.descriptionShort, this.description, this.photoUrl, this.year}); + + factory GameAttributesDataDto.fromJson(Map json) => + _$GameAttributesDataDtoFromJson(json); +} + +@JsonSerializable(createToJson: false) +class MetaDto { + final PaginationDto? pagination; + + const MetaDto({this.pagination}); + + factory MetaDto.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/dtos/games_dto.g.dart b/lib/data/dtos/games_dto.g.dart new file mode 100644 index 0000000..02e9499 --- /dev/null +++ b/lib/data/dtos/games_dto.g.dart @@ -0,0 +1,47 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'games_dto.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +GamesDto _$GamesDtoFromJson(Map json) => GamesDto( + data: (json['data'] as List?) + ?.map((e) => GameDataDto.fromJson(e as Map)) + .toList(), + meta: json['meta'] == null + ? null + : MetaDto.fromJson(json['meta'] as Map), + ); + +GameDataDto _$GameDataDtoFromJson(Map json) => GameDataDto( + id: json['id'] as String?, + attributes: (json['attributes'] as List?) + ?.map( + (e) => GameAttributesDataDto.fromJson(e as Map)) + .toList(), + ); + +GameAttributesDataDto _$GameAttributesDataDtoFromJson( + Map json) => + GameAttributesDataDto( + alias: json['alias'] as String?, + descriptionShort: json['descriptionShort'] as String?, + description: json['description'] as String?, + photoUrl: json['photoUrl'] as String?, + year: json['year'] 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/mappers/characters_mapper.dart b/lib/data/mappers/characters_mapper.dart deleted file mode 100644 index 3438478..0000000 --- a/lib/data/mappers/characters_mapper.dart +++ /dev/null @@ -1,32 +0,0 @@ -import 'package:flutter_test_app/data/dtos/characters_dto.dart'; -import 'package:flutter_test_app/domain/models/card.dart'; -import 'package:flutter_test_app/domain/models/home.dart'; - -const _imagePlaceholder = - 'https://upload.wikimedia.org/wikipedia/en/archive/b/b1/20210811082420%21Portrait_placeholder.png'; - -extension CharactersDtoToModel on CharactersDto { - HomeData toDomain() => HomeData( - data: data?.map((e) => e.toDomain()).toList(), - nextPage: meta?.pagination?.next, - ); -} - -extension CharacterDataDtoToModel on CharacterDataDto { - CardData toDomain() => CardData( - attributes?.name ?? 'UNKNOWN', - imageUrl: attributes?.image ?? _imagePlaceholder, - descriptionText: _makeDescriptionText(attributes?.born, attributes?.died), - id: id, - ); - - String _makeDescriptionText(String? born, String? died) { - return born != null && died != null - ? '$born - $died' - : born != null - ? 'born: $born' - : died != null - ? 'died: $died' - : ''; - } -} diff --git a/lib/data/mappers/games_mapper.dart b/lib/data/mappers/games_mapper.dart new file mode 100644 index 0000000..fba8c0a --- /dev/null +++ b/lib/data/mappers/games_mapper.dart @@ -0,0 +1,26 @@ +import 'package:flutter_test_app/data/dtos/games_dto.dart'; +import 'package:flutter_test_app/domain/models/card.dart'; +import 'package:flutter_test_app/domain/models/home.dart'; + +const _imagePlaceholder = + 'https://upload.wikimedia.org/wikipedia/en/archive/b/b1/20210811082420%21Portrait_placeholder.png'; + +extension GamesDtoToModel on GamesDto { + HomeData toDomain() => HomeData( + data: data?.map((e) => e.toDomain()).toList(), + nextPage: meta?.pagination?.next, + ); +} + +extension GameDataDtoToModel on GameDataDto { + CardData toDomain() => CardData( + attributes?.alias ?? 'UNKNOWN', + imageUrl: attributes?.photoUrl ?? _imagePlaceholder, + descriptionText: _makeDescriptionText(attributes?.descriptionShort, attributes?.description, attributes?.year), + id: id, + ); + + String _makeDescriptionText(String? descriptionShort, String? description, String? year) { + return 'Год издания: $year. Описание: $descriptionShort'; + } +} diff --git a/lib/data/repositories/potter_repository.dart b/lib/data/repositories/game_repository.dart similarity index 61% rename from lib/data/repositories/potter_repository.dart rename to lib/data/repositories/game_repository.dart index b3ada5f..18b22d9 100644 --- a/lib/data/repositories/potter_repository.dart +++ b/lib/data/repositories/game_repository.dart @@ -1,39 +1,38 @@ import 'package:dio/dio.dart'; -import 'package:flutter_test_app/data/dtos/characters_dto.dart'; -import 'package:flutter_test_app/data/mappers/characters_mapper.dart'; +import 'package:flutter_test_app/data/dtos/games_dto.dart'; +import 'package:flutter_test_app/data/mappers/games_mapper.dart'; import 'package:flutter_test_app/data/repositories/api_interface.dart'; import 'package:flutter_test_app/domain/models/home.dart'; import 'package:pretty_dio_logger/pretty_dio_logger.dart'; -class PotterRepository extends ApiInterface { +class GameRepository extends ApiInterface { static final Dio _dio = Dio() ..interceptors.add(PrettyDioLogger( requestHeader: true, requestBody: true, )); - static const String _baseUrl = 'https://api.potterdb.com'; + static const String _baseUrl = 'https://api.tesera.ru/'; @override Future loadData({ OnErrorCallback? onError, - String? q, + String? alias, int page = 1, int pageSize = 25, }) async { try { - const String url = '$_baseUrl/v1/characters'; + const String url = '$_baseUrl/games'; final Response response = await _dio.get>( url, queryParameters: { - 'filter[name_cont]': q, - 'page[number]': page, - 'page[size]': pageSize, + 'offset': page, + 'limit': pageSize, }, ); - final CharactersDto dto = CharactersDto.fromJson(response.data as Map); + final GamesDto dto = GamesDto.fromJson(response.data as Map); final HomeData data = dto.toDomain(); return data; } on DioException catch (e) { diff --git a/lib/domain/models/card.dart b/lib/domain/models/card.dart index 58cfb63..5d2d9dc 100644 --- a/lib/domain/models/card.dart +++ b/lib/domain/models/card.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_test_app/lib/data/dtos/games_dto.dart'; class CardData { final String text; diff --git a/lib/main.dart b/lib/main.dart index 0c94b2a..a6d69da 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,7 +3,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_test_app/components/locale/l10n/app_locale.dart'; -import 'package:flutter_test_app/data/repositories/potter_repository.dart'; +import 'package:flutter_test_app/data/repositories/game_repository.dart'; import 'package:flutter_test_app/presentation/home_page/bloc/bloc.dart'; import 'package:flutter_test_app/presentation/home_page/home_page.dart'; import 'package:flutter_test_app/presentation/like_bloc/like_bloc.dart'; @@ -34,15 +34,15 @@ class MyApp extends StatelessWidget { colorScheme: ColorScheme.fromSeed(seedColor: Colors.orangeAccent), useMaterial3: true, ), - home: RepositoryProvider( + home: RepositoryProvider( lazy: true, - create: (_) => PotterRepository(), + create: (_) => GameRepository(), child: BlocProvider( lazy: false, create: (context) => LikeBloc(), child: BlocProvider( lazy: false, - create: (context) => HomeBloc(context.read()), + create: (context) => HomeBloc(context.read()), child: const HomePage(), ), ), diff --git a/lib/presentation/home_page/bloc/bloc.dart b/lib/presentation/home_page/bloc/bloc.dart index 024de8c..9f6f9ac 100644 --- a/lib/presentation/home_page/bloc/bloc.dart +++ b/lib/presentation/home_page/bloc/bloc.dart @@ -1,10 +1,10 @@ import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_test_app/data/repositories/potter_repository.dart'; +import 'package:flutter_test_app/data/repositories/game_repository.dart'; import 'package:flutter_test_app/presentation/home_page/bloc/events.dart'; import 'package:flutter_test_app/presentation/home_page/bloc/state.dart'; class HomeBloc extends Bloc { - final PotterRepository repo; + final GameRepository repo; HomeBloc(this.repo) : super(const HomeState()) { on(_onLoadData); @@ -20,7 +20,7 @@ class HomeBloc extends Bloc { String? error; final data = await repo.loadData( - q: event.search, + alias: event.search, page: event.nextPage ?? 1, onError: (e) => error = e, ); diff --git a/lib/presentation/home_page/bloc/state.g.dart b/lib/presentation/home_page/bloc/state.g.dart index 266aa3d..114ac25 100644 --- a/lib/presentation/home_page/bloc/state.g.dart +++ b/lib/presentation/home_page/bloc/state.g.dart @@ -65,20 +65,21 @@ class _$HomeStateCWProxyImpl implements _$HomeStateCWProxy { return HomeState( data: data == const $CopyWithPlaceholder() ? _value.data - // ignore: cast_nullable_to_non_nullable + // ignore: cast_nullable_to_non_nullable : data as HomeData?, isLoading: isLoading == const $CopyWithPlaceholder() || isLoading == null ? _value.isLoading - // ignore: cast_nullable_to_non_nullable + // 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, + 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 + // ignore: cast_nullable_to_non_nullable : error as String?, ); } diff --git a/lib/presentation/like_bloc/like_state.g.dart b/lib/presentation/like_bloc/like_state.g.dart index 4d95a53..0888cf2 100644 --- a/lib/presentation/like_bloc/like_state.g.dart +++ b/lib/presentation/like_bloc/like_state.g.dart @@ -43,7 +43,7 @@ class _$LikeStateCWProxyImpl implements _$LikeStateCWProxy { return LikeState( likedIds: likedIds == const $CopyWithPlaceholder() ? _value.likedIds - // ignore: cast_nullable_to_non_nullable + // ignore: cast_nullable_to_non_nullable : likedIds as List?, ); } diff --git a/lib/presentation/locale_bloc/locale_state.g.dart b/lib/presentation/locale_bloc/locale_state.g.dart index b5b7324..e374db6 100644 --- a/lib/presentation/locale_bloc/locale_state.g.dart +++ b/lib/presentation/locale_bloc/locale_state.g.dart @@ -27,7 +27,8 @@ class _$LocaleStateCWProxyImpl implements _$LocaleStateCWProxy { final LocaleState _value; @override - LocaleState currentLocale(Locale currentLocale) => this(currentLocale: currentLocale); + LocaleState currentLocale(Locale currentLocale) => + this(currentLocale: currentLocale); @override @@ -41,10 +42,11 @@ class _$LocaleStateCWProxyImpl implements _$LocaleStateCWProxy { Object? currentLocale = const $CopyWithPlaceholder(), }) { return LocaleState( - currentLocale: currentLocale == const $CopyWithPlaceholder() || currentLocale == null - ? _value.currentLocale - // ignore: cast_nullable_to_non_nullable - : currentLocale as Locale, + currentLocale: + currentLocale == const $CopyWithPlaceholder() || currentLocale == null + ? _value.currentLocale + // ignore: cast_nullable_to_non_nullable + : currentLocale as Locale, ); } }