☁️ P07: Master Pokedex (Conectando à Nuvem)

Este é o projeto que separa os iniciantes dos profissionais! Você vai conectar seu app à internet para buscar dados reais da PokeAPI. Prepare-se para lidar com JSON, APIs e carregamento de imagens externas.


🎯 Objetivo do Projeto

Criar uma Pokedex que, ao ser aberta, busca uma lista de Pokémons no servidor. O app deve carregar a foto oficial de cada Pokémon direto da nuvem usando a biblioteca Coil.


📖 Dicionário do Projeto

  • API: Um servidor na internet que “serve” dados para o seu app.

  • Retrofit: A biblioteca mais famosa do Android para “conversar” com APIs.

  • JSON: O formato de texto que o servidor envia (parece uma lista de atributos).

  • Coil: Biblioteca usada para carregar imagens a partir de uma URL da internet.


🏗️ Passo a Passo (Wizard do Android Studio)

  1. Template: Empty Compose Activity.

  2. Name: AppMasterPokedex_SeuNome.

  3. Package Name: br.com.curso.masterpokedex.


🎨 Parte 1: O Modelo de Dados (Response)

O servidor envia os dados assim: { "name": "pikachu", "url": "..." }. Precisamos criar uma “gaveta” igual no Kotlin.

data class PokemonListResponse(
    val results: List<PokemonBrief>
)
 
data class PokemonBrief(
    val name: String,
    val url: String
)

⚙️ Parte 2: O Garçom (Interface Retrofit)

interface PokeApiService {
    @GET("pokemon?limit=20")
    suspend fun getList(): PokemonListResponse
}

✅ Gabarito Comentado (Carregamento de Imagem)

Para mostrar a foto que vem da internet, use o AsyncImage do Coil. Como a PokeAPI não retorna a imagem na lista, usamos o ID do Pokémon para buscar a imagem oficial no GitHub:

@Composable
fun PokemonCard(pokemon: PokemonBrief) {
    // Extrair ID da URL: "https://pokeapi.co/api/v2/pokemon/1/" -> "1"
    val id = pokemon.url.split("/").dropLast(1).lastOrNull() ?: "1"
    val imageUrl = "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/official-artwork/$id.png"
 
    Card(modifier = Modifier.padding(8.dp)) {
        Column(horizontalAlignment = Alignment.CenterHorizontally) {
            AsyncImage(
                model = imageUrl,
                contentDescription = pokemon.name,
                modifier = Modifier.size(100.dp)
            )
            Text(text = pokemon.name.uppercase(), fontWeight = FontWeight.Bold)
        }
    }
}

📂 Organização de Pastas (Padrão Profissional)

br.com.curso.masterpokedex.data.network PokeApi.kt (Contém os modelos e a interface).

br.com.curso.masterpokedex MainActivity.kt (Contém a UI e a lógica de chamada).


??? Requisitos de Configuração e Solução de Problemas

Se você encontrar erros ao tentar rodar este projeto, verifique os pontos abaixo:

1. Permissão de Internet

Certifique-se de adicionar a permissão no AndroidManifest.xml:

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

2. Suporte ao AndroidX

O arquivo gradle.properties na raiz do projeto deve conter:

android.useAndroidX=true

android.enableJetifier=true

org.gradle.jvmargs=-Xmx2048m

3. Dependências do Retrofit e Coil

Certifique-se de adicionar as dependências no build.gradle.