Курсач доработка!

This commit is contained in:
Stepan 2024-12-21 14:21:47 +04:00
parent 17d74c828b
commit f303d8e459
7 changed files with 30 additions and 11 deletions

@ -1,4 +1,5 @@
import '../../domain/models/card.dart'; import '../../domain/models/card.dart';
import '../../domain/models/home.dart';
import '../dtos/characters_dto.dart'; import '../dtos/characters_dto.dart';
extension CharacterDtoToModel on CharacterDto { extension CharacterDtoToModel on CharacterDto {
@ -10,3 +11,9 @@ extension CharacterDtoToModel on CharacterDto {
imageUrl: displayIcon, imageUrl: displayIcon,
); );
} }
extension CharactersDtoToModel on CharactersDto {
HomeData toDomain() => HomeData(
data: data?.map((e) => e.toDomain()).toList(),
);
}

@ -1,7 +1,8 @@
import '../../domain/models/card.dart'; import '../../domain/models/card.dart';
import '../../domain/models/home.dart';
typedef OnErrorCallback = void Function(String? error); typedef OnErrorCallback = void Function(String? error);
abstract class ApiInterface { abstract class ApiInterface {
Future<List<CardData>?> loadData(); Future<HomeData?> loadData({String? q});
} }

@ -3,6 +3,7 @@ import 'package:flutter_test_app/data/mappers/characters_mapper.dart';
import 'package:pretty_dio_logger/pretty_dio_logger.dart'; import 'package:pretty_dio_logger/pretty_dio_logger.dart';
import '../../domain/models/card.dart'; import '../../domain/models/card.dart';
import '../../domain/models/home.dart';
import '../dtos/characters_dto.dart'; import '../dtos/characters_dto.dart';
import 'api_interface.dart'; import 'api_interface.dart';
@ -16,7 +17,7 @@ class AgentsRepository extends ApiInterface {
static const String _baseUrl = 'https://valorant-api.com/v1/agents'; static const String _baseUrl = 'https://valorant-api.com/v1/agents';
@override @override
Future<List<CardData>?> loadData({ Future<HomeData?> loadData({
OnErrorCallback? onError, OnErrorCallback? onError,
String? q, String? q,
}) async { }) async {
@ -29,13 +30,14 @@ class AgentsRepository extends ApiInterface {
// Преобразование данных JSON в CharactersDto, затем в CardData // Преобразование данных JSON в CharactersDto, затем в CardData
final CharactersDto dto = CharactersDto.fromJson({'data': agentsData}); final CharactersDto dto = CharactersDto.fromJson({'data': agentsData});
List<CardData>? data = dto.data?.map((e) => e.toDomain()).toList(); var data = dto.toDomain();
// Фильтрация данных по displayName // Фильтрация данных по displayName
if (q != null && q.isNotEmpty) { if (q != null && q.isNotEmpty) {
data = data final filteredData = data.data
?.where((agent) => agent.text?.toLowerCase().contains(q.toLowerCase()) ?? false) ?.where((agent) => agent.text?.toLowerCase().contains(q.toLowerCase()) ?? false)
.toList(); .toList();
data = HomeData(data: filteredData);
} }
return data; return data;

@ -1,7 +1,7 @@
import '../../domain/models/card.dart'; import '../../domain/models/card.dart';
import 'api_interface.dart'; import 'api_interface.dart';
class MockRepository extends ApiInterface { /*class MockRepository extends ApiInterface {
@override @override
Future<List<CardData>?> loadData() async { Future<List<CardData>?> loadData() async {
return [ return [
@ -37,4 +37,4 @@ class MockRepository extends ApiInterface {
'ужасам Галактики в эпических боях сразу на нескольких планетах. Раскройте мрачные секреты и отбросьте тень вечной ночи.'), 'ужасам Галактики в эпических боях сразу на нескольких планетах. Раскройте мрачные секреты и отбросьте тень вечной ночи.'),
]; ];
} }
} }*/

@ -0,0 +1,7 @@
import 'card.dart';
class HomeData {
final List<CardData>? data;
HomeData({this.data});
}

@ -1,11 +1,13 @@
import 'package:copy_with_extension/copy_with_extension.dart'; import 'package:copy_with_extension/copy_with_extension.dart';
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
import '../../../domain/models/card.dart'; /*import '../../../domain/models/card.dart*/
import '../../../domain/models/home.dart';
@CopyWith() @CopyWith()
class HomeState extends Equatable { class HomeState extends Equatable {
//сравнение двух состояний через Equatable //сравнение двух состояний через Equatable
final List<CardData>? data; final HomeData? data;
/*final List<CardData>? data;*/
final bool isLoading; //отображение загрузки final bool isLoading; //отображение загрузки
final String? error; //отображение ошибок final String? error; //отображение ошибок
@ -17,7 +19,7 @@ class HomeState extends Equatable {
HomeState copyWith({ HomeState copyWith({
//copyWith создаёт копию объекта с изменением некоторых данных //copyWith создаёт копию объекта с изменением некоторых данных
List<CardData>? data, HomeData? data,
bool? isLoading, bool? isLoading,
String? error, String? error,
}) => }) =>

@ -155,9 +155,9 @@ class _BodyState extends State<Body> {
onRefresh: _onRefresh, onRefresh: _onRefresh,
child: ListView.builder( child: ListView.builder(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
itemCount: state.data?.length ?? 0, itemCount: state.data?.data?.length ?? 0,
itemBuilder: (context, index) { itemBuilder: (context, index) {
final data = state.data?[index]; final data = state.data?.data?[index];
return data != null return data != null
? _Card.fromData( ? _Card.fromData(
data, data,