IC

Iago Carvalho17/08/2023 19:48
Compartilhe

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

    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.