☁️ 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)
-
Template: Empty Compose Activity.
-
Name:
AppMasterPokedex_SeuNome. -
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.