image

Acesse bootcamps ilimitados e +650 cursos

50
%OFF

IC

Iago Carvalho17/08/2023 19:48
Compartilhe

Jetpack Compose como consumir uma api com usando Retrofi e arquitetura MVVM em 6 passos

  • #Kotlin
  • #Android

Antes de começar, gostaria de mencionar que ainda estou aprendendo, e decidi criar este artico com intuido de ajudar pessoas que tambem estão aprendendo, além de me forçar a criar um passo a passo de como consumir uma api, afinal ensinar talvez seja a melhor forma de aprender,

Meu Linkedin: https://www.linkedin.com/in/iago-carvalho-b096a21b8/ bora aumentar essas conexões em

git do projeto : https://github.com/iagocarvalho07/ValorantApp

dito isso,vamos fazer um combinado, vou me esforçar para criar conteudo pratico facil e bem visual com imagens e codigos para facilitar sua compreenção, e quem estiver disposto a ler, vai se esforçar um pouco pra tentar entender ^^

espero de verdade que isto lhe ajude de alguma maneira

let´s go

Este artigo abordará o processo de consumo de uma API utilizando Retrofit, uma biblioteca popular para comunicação de rede em aplicativos Android, juntamente com Kotlin e Jetpack Compose.

Nos dias de hoje, consumir APIs é uma tarefa crucial para o desenvolvimento de aplicativos móveis modernos. Retrofit se destaca como uma ferramenta poderosa que simplifica significativamente a comunicação com servidor e otimiza a transferência de dados.

Vamos explorar como Retrofit funciona em combinação com a linguagem de programação Kotlin e a biblioteca Jetpack Compose. Kotlin é conhecido por sua concisão e segurança de tipo, tornando-o uma escolha popular para o desenvolvimento de aplicativos Android. Jetpack Compose, por sua vez, é uma nova biblioteca para criação de interfaces do usuário declarativas e reativas.

Você aprenderá como configurar o Retrofit em um projeto Kotlin e como criar uma interface para descrever as chamadas da API. Iremos abordar também a estruturação do código para organizar as chamadas da API de forma eficiente,

Tentaremos abordar esse processo em 6 passos:

estaremos consumindo a API do jogo valorante a qual pode ser encontrada aqui :

https://dash.valorant-api.com/endpoints/agents

o Repositorio do projeto:

Passo 1: Configurar o Retrofit:

Adicionar as permições de acesso a internet em seu arquivo AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"/>

em seu arquivo build.gradel(Module : app)

image

adicione essas Dependencias

// Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
// Gson Converter
implementation 'com.google.code.gson:gson:2.10.1'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

são dependencias do retrofir e gson converte, são bibliotecas que facilitarão nosso desenvolvimento e consumo de APIs,

lembre-se de consultar o site oficial das bibliotecas para pegar sempre a versão mais atualizada

site: https://square.github.io/retrofit/

apos colar essas dependencias em seu arquivo gradle, clique em Sync Now no canto superior direito, dete modo o Android baixara todas os arquivos nescessarios para o consumo da Api

Etapa 2: definir o modelo de dados

para esta esta, podemos utilizar um Plugin que facilita a criação de classes e modelos de dados vindo da Api

Site oficial do puglin: https://plugins.jetbrains.com/plugin/9960-json-to-kotlin-class-jsontokotlinclass-

image

Discrição do proprio puglin: definir o modelo de Gerandor de classe Kotlin de qualquer string/JSONSchema JSON legal ou qualquer URL que retorne uma string/JSONSchema JSON como resposta.

apos a instalação do puglin, crie um package, em meu app criei com nome de Model, (nome comum para modelo de dados)

dentro de package crie outro pacote com o nome do end point que consumira, isso e apenas para facilitar a organização,

aqui criei com o nome de respose: em seu package clique com o botão direito, vá em new, e uma nova forma decriar arquivos esta disponivel, graças ao puglin: Kotlin data class file

image

Qual nova aba se abrira, nela podemos passar a Url do end point que queremos consumir :

cliando em Retrieve contente from Http URL:

Image 1 : para facilitar o entendimento :

image

Imagen 2 : coloque a Url que quer criar o modelo de dados, neste caso estaremos usando a URL:

https://valorant-api.com/v1/agents

image

Imagen 3 : esqueva o nome da classe que desejar em Class name, e clique em Generate

image

Seguindo este passo a passo sera possivel criar um modelo de dados de maneira simples e facil para posteriormente consumir a api, esta etapa criara as classes e arquivos de forma organizada em seu app, e ficara mais o menos assim: ^^

image

Agora estamos prontos para Iniciar a Configuração do Retrofit :

Passo 3: Configure o Retrofit

Para fins de Separação de codigo e tornar seu App mais limpo e de facil visualização crie um package com nome de Network, dentro deste pacote e então crie uma interface de serviço Retrofit para definir os endpoints da API. Crie um novo arquivo Kotlin chamado ValorantService.kt (o nome pode ser oque quizer, mas usando o Service e um padrão para desenvolvedores)

adicione o seguinte código:

interface ValorantService {
  @GET("agents")
  suspend fun getCreditCars(): ModelValorant
}

a ) a anotação @GET serve para adicionarmos o end point da api

b) criamos uma função suspensa para usarmos as ferrementas do kotlin a nosso favor, isso permite que o codigo seja chamado em segundo plano evitando o travamente da tela ou main traid se preferir

Em seguida, crie uma instância do Retrofit para realizar solicitações de rede. Crie um novo arquivo Kotlin chamado ValorantApi.kt e adicione o seguinte código:

object ValorantApi {
  private const val BASE_URL = "https://valorant-api.com/v1/"

  private val retrofit: Retrofit by lazy {
      Retrofit.Builder()
          .baseUrl(BASE_URL)
          .addConverterFactory(GsonConverterFactory.create())
          .build()
  }

  val valorantApiService: ValorantService by lazy {
      retrofit.create(ValorantService::class.java)
  }
}

C) a private const val BASE_URL. recebe o end point da api porem sem o parte final onde adiconamos na etapa anterior, isso serve para que possamos adicionar outros end pontis da api de forma simple ao nosso codigo, como por exemplo :

image

o @GET("weapons") recebe outro end point para outra chamada da api, so a tituto de exeplo ^^

Etapa 4: criar o repositório

Crie uma classe de repositório para lidar com operações de dados. Crie um novo arquivo Kotlin chamado ValorantRepository.kt e adicione o seguinte código:

class ValorantRespository() {
  private val valorantAgentsRepo = ValorantApi.valorantApiService

  suspend fun getValorantCards(): ModelValorant{
      return valorantAgentsRepo.getCreditCars()
  }

  suspend fun getDetalhesValorant(): ModelValorant {
      return valorantAgentsRepo.getCreditCars()
  }
}

A ) a varial vel privada valoranteAgentsRepo recebe os dados vindos do objeto criadado na estapa anterior ValoranteApi

e recebe sua fvariavel valoranteApiService

B ) a função getvaloranteCards, enda os daddos Da Model Valorante que criamos na etapa 2

C ) essa função retorna a variavel valoranteAgentsRepo chamando a função getCreditCars do arquivo ValoranteService

Etapa 5: Implementando o ViewModel

Crie uma classe ViewModel para gerenciar os dados de sua interface do usuário combinável. Crie um novo arquivo Kotlin chamado AgentsValorantViewModel.kt e adicione o seguinte código:

class AgentsValorantViewModel(): ViewModel() {

  private val respository = ValorantRespository()

  private val _valorantAgents = MutableLiveData<ModelValorant>()
  val valorantAgents: LiveData<ModelValorant> = _valorantAgents

  fun fetValorantAgents(){
      viewModelScope.launch {
          try {
              val agents = respository.getValorantCards()
              _valorantAgents.value = agents
          }catch (e: Exception){
              Log.d("EXC", "fetValorantAgents: ${e.message.toString()}")
          }
      }
  }


}

A ) a variavel, repository recebe os dados vendos da Class ValorantRepository, criada na etapa anterior

B ) criamos uma variavel privada _valorantAgents que recebe um MutableLiveData que observa os dados de classe ModelValorante, Criada na etapa 2

C) e uma varial ValoranteAgents que posteriormente vai receber os dados que a varialvel privada obtiver da api, essa varialvel que sera instanciada na nossa Ui Futuramente.

D ) a Função fetValorantAgents recebe um viewmodelScope, isso e nescessario pois as funções da vindas do repositorio e de outras classes foram marcadas como suspensa

E ) no bloco de codigo try catch, tentamos chamar a api e passar os dados da api para a variavel privada _valorantAgents

caso de errado mostrara um log com o motivo da exeption

Etapa 6 : Crie uma Composable Ui

@Composable
fun AgentsValorantScreen(
  navController: NavController,
  viewModel: AgentsValorantViewModel = viewModel()
) {
  val valorantCards by viewModel.valorantAgents.observeAsState(null)
  val overlap = (-110).dp
  LaunchedEffect(Unit) {
      viewModel.fetValorantAgents()
  }

  Column(
      modifier = Modifier.fillMaxSize(),
      verticalArrangement = Arrangement.Center,
      horizontalAlignment = Alignment.CenterHorizontally
  ) {
      if (valorantCards == null) {
          CircularProgressIndicator()
      } else {
          LazyColumn(
              horizontalAlignment = Alignment.CenterHorizontally,
              verticalArrangement = Arrangement.spacedBy(overlap),
          ) {
              itemsIndexed(valorantCards!!.data) { index, valorantCards ->
                  AsyncImage(model = valorantCards.displayIcon, contentDescription = "")
                  Text(text = valorantCards.displayName)

          }
      }
  }
}

A) a função comsable AgetsValorantScreen, recebe um parametro viewmodel, o qual herda os dados da AgentsValorantViewModel, detro do bloco de codgo da função a variavel valorantCards recebe essa viewmodel e observa os dados com a função onserveAsState, aqui os dados ja estão prontos para serem exibidos o restante e estilização e criação de sua Ui

B ) utilizando o LazyColumn, podemos mostra todos os dados vindos da Api em forma de colula, Se tudo ocorreu como planejado, os dados vindos da API ficarão da seguinte forma:

image

Bom Acabamos por aqui, agora fica o desafio, estilizar a Tela De forma que de gosto de ver, boa sorte.

Esta foi minha estilização:

Repositorio no git: https://github.com/iagocarvalho07/ValorantApp

image

Compartilhe
Comentários (4)

PM

Pedro Moura - 18/08/2023 09:23

Show de bola, muito bom!

AM

Alan Modesto - 18/08/2023 09:29

Que projeto absurdo, diferenciado total.

KELVIN RODRIGUES
KELVIN RODRIGUES - 17/08/2023 20:33

Melhor artigo que poderia existir nesse bootcamp 🚀

Raiara Araujo
Raiara Araujo - 17/08/2023 22:24

Parabéns! Ficou bem explicado.