🛣️ViaCEP Request
Aqui vou demonstrar como foi feito a requisição de dados de endereço, através do CEP, utilizando a API ViaCep, seguindo a nossa arquitetura padrão.
Primeiramente, a declaração do objeto que é retornado pela API:
import 'package:json_annotation/json_annotation.dart';
part "address.g.dart";
@JsonSerializable()
class Address {
@JsonKey(defaultValue: '')
final String? cep;
@JsonKey(defaultValue: '', name: "logradouro")
final String? street;
@JsonKey(defaultValue: '', name: "bairro")
final String? neighboor;
@JsonKey(defaultValue: '', name: "complemento")
final String? complement;
@JsonKey(defaultValue: '', name: "localidade")
final String? city;
@JsonKey(defaultValue: '', name: "uf")
final String? state;
Address({
this.cep,
this.street,
this.neighboor,
this.complement,
this.state,
this.city,
});
factory Address.fromJson(Map<String, dynamic> json) =>
_$AddressFromJson(json);
Map<String, dynamic> toJson() => _$AddressToJson(this);
}
Seguindo o uso de nossa arquitetura, no código abaixo vou apenas demonstrar como ficou o usecase abstrato e a sua implementação.
abstract class IGetAddressByCepUsecase {
Future<Address> call({
required String postalCode,
});
}
class GetAddressByCepUsecase implements IGetAddressByCepUsecase {
@override
Future<Address> call({required String postalCode}) {
return GetIt.I
.get<IAddressesRepository>()
.getAddressByCep(postalCode: postalCode);
}
}
E por fim, a declaração abstrata do repository e a sua implementação no datasource:
abstract class IAddressesRepository {
Future<Address> getAddressByCep({
required String postalCode,
});
}
part "address_datasource.g.dart";
@RestApi()
abstract class AddressDatasource implements IAddressesRepository {
factory AddressDatasource(Dio dio, {String baseUrl}) = _AddressDatasource;
@override
@GET("{postalCode}/json/")
@Header(JSON_HEADER)
Future<Address> getAddressByCep({@Path() required String postalCode});
}
Este datasource, tem que ser implementado no getIt (ou afins), passando como url base a seguinte:
"https://viacep.com.br/ws/"
Da seguinte maneira:
GetIt.I.registerSingleton<IAddressesRepository>(
AddressDatasource(DioConfig().dio, baseUrl: "https://viacep.com.br/ws/"));
Com isso feito, podemos simplesmente fazer a chamada do nosso usecase abstrato, passando como paramêtro um CEP válido. Ex:
await GetIt.I.get<IGetAddressByCepUsecase>()(
postalCode: "85035000",
);
E o retorno será o nosso objeto Address criado anteriormente.
No futuro, será criado um package externo para fazer esta busca, que utilizaremos nos nossos projetos, para apenas fazer a chamada, e não necessitar da implementação em todos os projetos desde o inicio.
Last updated