к черту пагинацию

This commit is contained in:
Галина Федоренко 2024-11-13 20:17:46 +04:00
parent 57d946a8a2
commit 1d53a1c62b
4 changed files with 36 additions and 97 deletions

View File

@ -3,56 +3,26 @@ import 'package:json_annotation/json_annotation.dart';
part 'thrones_character_dto.g.dart'; part 'thrones_character_dto.g.dart';
@JsonSerializable(createToJson: false) @JsonSerializable(createToJson: false)
class ThronesCharactersDto { class ThronesCharacterDto {
final List<ThronesCharacterDataDto> characters; final int id;
final InfoDto? info; final String firstName;
final String lastName;
final String fullName;
final String title;
final String family;
final String image;
final String imageUrl;
const ThronesCharactersDto({required this.characters, this.info}); ThronesCharacterDto({
required this.id,
required this.firstName,
required this.lastName,
required this.fullName,
required this.title,
required this.family,
required this.image,
required this.imageUrl,
});
factory ThronesCharactersDto.fromJson(List<dynamic> json) { factory ThronesCharacterDto.fromJson(Map<String, dynamic> json) => _$ThronesCharacterDtoFromJson(json);
final List<ThronesCharacterDataDto> characters = json
.map((item) => ThronesCharacterDataDto.fromJson(item as Map<String, dynamic>))
.toList();
return ThronesCharactersDto(characters: characters);
}
}
@JsonSerializable(createToJson: false)
class ThronesCharacterDataDto {
final int? id;
final String? firstName;
final String? lastName;
final String? fullName;
final String? title;
final String? family;
final String? image;
final String? imageUrl;
const ThronesCharacterDataDto(
{this.id, this.firstName, this.lastName, this.fullName, this.title, this.family, this.image, this.imageUrl,});
factory ThronesCharacterDataDto.fromJson(Map<String, dynamic> json) =>
_$ThronesCharacterDataDtoFromJson(json);
}
@JsonSerializable(createToJson: false)
class InfoDto {
final String? next;
final String? last;
final int? nextPage;
final int? lastPage;
InfoDto({this.next, this.last})
: nextPage = _extractPageNumber(next),
lastPage = _extractPageNumber(last);
static int? _extractPageNumber(String? url) {
if (url == null) return null;
final RegExp regExp = RegExp(r'page=(\d+)');
final Match? match = regExp.firstMatch(url);
return match != null ? int.parse(match.group(1)!) : null;
}
factory InfoDto.fromJson(Map<String, dynamic> json) =>
_$InfoDtoFromJson(json);
} }

View File

@ -6,32 +6,14 @@ part of 'thrones_character_dto.dart';
// JsonSerializableGenerator // JsonSerializableGenerator
// ************************************************************************** // **************************************************************************
ThronesCharactersDto _$ThronesCharactersDtoFromJson( ThronesCharacterDto _$ThronesCharacterDtoFromJson(Map<String, dynamic> json) =>
Map<String, dynamic> json) => ThronesCharacterDto(
ThronesCharactersDto( id: (json['id'] as num).toInt(),
characters: (json['characters'] as List<dynamic>) firstName: json['firstName'] as String,
.map((e) => lastName: json['lastName'] as String,
ThronesCharacterDataDto.fromJson(e as Map<String, dynamic>)) fullName: json['fullName'] as String,
.toList(), title: json['title'] as String,
info: json['info'] == null family: json['family'] as String,
? null image: json['image'] as String,
: InfoDto.fromJson(json['info'] as Map<String, dynamic>), imageUrl: json['imageUrl'] as String,
);
ThronesCharacterDataDto _$ThronesCharacterDataDtoFromJson(
Map<String, dynamic> json) =>
ThronesCharacterDataDto(
id: (json['id'] as num?)?.toInt(),
firstName: json['firstName'] as String?,
lastName: json['lastName'] as String?,
fullName: json['fullName'] as String?,
title: json['title'] as String?,
family: json['family'] as String?,
image: json['image'] as String?,
imageUrl: json['imageUrl'] as String?,
);
InfoDto _$InfoDtoFromJson(Map<String, dynamic> json) => InfoDto(
next: json['next'] as String?,
last: json['last'] as String?,
); );

View File

@ -5,7 +5,7 @@ import 'package:flutter_app/domain/models/home.dart';
const _imagePlaceholder = const _imagePlaceholder =
'https://upload.wikimedia.org/wikipedia/en/archive/b/b1/20210811082420%21Portrait_placeholder.png'; 'https://upload.wikimedia.org/wikipedia/en/archive/b/b1/20210811082420%21Portrait_placeholder.png';
extension ThronesCharacterDtoToModel on ThronesCharacterDataDto { extension ThronesCharacterDtoToModel on ThronesCharacterDto {
CardData toDomain() => CardData( CardData toDomain() => CardData(
descriptionText: _makeDescriptionText(title, family), descriptionText: _makeDescriptionText(title, family),
firstName: firstName, firstName: firstName,
@ -27,10 +27,3 @@ extension ThronesCharacterDtoToModel on ThronesCharacterDataDto {
: ''; : '';
} }
} }
extension ThronesCharactersDtoToModel on ThronesCharactersDto {
HomeData toDomain() => HomeData(
data: characters.map((e) => e.toDomain()).toList(),
nextPage: info?.nextPage,
);
}

View File

@ -7,11 +7,7 @@ import 'package:flutter_app/domain/models/home.dart';
import 'package:pretty_dio_logger/pretty_dio_logger.dart'; import 'package:pretty_dio_logger/pretty_dio_logger.dart';
class ThronesRepository extends ApiInterface { class ThronesRepository extends ApiInterface {
static final Dio _dio = Dio() static final Dio _dio = Dio();
..interceptors.add(PrettyDioLogger(
requestHeader: true,
requestBody: true,
));
static const String _baseUrl = 'https://thronesapi.com'; static const String _baseUrl = 'https://thronesapi.com';
@ -24,16 +20,14 @@ class ThronesRepository extends ApiInterface {
try { try {
const String url = '$_baseUrl/api/v2/Characters'; const String url = '$_baseUrl/api/v2/Characters';
final Response<dynamic> response = await _dio.get<List<dynamic>>( final Response<dynamic> response = await _dio.get<List<dynamic>>(url);
url,
);
final List<ThronesCharacterDataDto> characters = (response.data as List<dynamic>) final List<ThronesCharacterDto> characters = (response.data as List<dynamic>)
.map((e) => ThronesCharacterDataDto.fromJson(e as Map<String, dynamic>)) .map((e) => ThronesCharacterDto.fromJson(e as Map<String, dynamic>))
.toList(); .toList();
final List<CardData> data = characters final List<CardData> data = characters
.where((character) => q == null || character.fullName!.toLowerCase().contains(q.toLowerCase())) .where((character) => q == null || character.fullName.toLowerCase().contains(q.toLowerCase()))
.map((e) => e.toDomain()) .map((e) => e.toDomain())
.toList(); .toList();