🛣️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.

Last updated