⚡ Cap 07: Vida Reativa (Estado no Compose)
🎯 Objetivo da Aula: Ao final desta aula, você entenderá o conceito de Estado. Você será capaz de criar variáveis que “avisam” a tela para se atualizar sozinha sempre que o valor mudar, permitindo criar contadores de XP e barras de vida.
🏢 O Cenário Prático (Seu Desafio): Até agora, suas telas são como fotos: elas não mudam. Se o jogador ganha XP, o número na tela continua parado. Seu desafio é criar a Arena de Treino: uma tela com um botão “Treinar” que, a cada clique, aumenta o XP do jogador na tela em tempo real.
🧠 Fundamentos: A Teoria Traduzida
📖 Dicionário do Programador
- Estado (State): É a “Memória” da tela. É o que o app está mostrando agora.
- Recomposição: É quando o Android percebe que o valor mudou e “redesenha” a tela instantaneamente para mostrar o novo número.
- remember { … }: É o comando que diz ao app: “Não esqueça esse valor se a tela piscar!“.
🎨 O Padrão de Estado
No Compose, não usamos variáveis comuns (var x = 0). Usamos uma estrutura especial para que a tela “vigie” o valor:
var xp by remember { mutableStateOf(0) }
graph LR A[Clique no Botão] --> B[Altera o Estado: xp = 10] B --> C[Compose percebe a mudança] C --> D[Recomposição: Tela atualiza o texto]
📖 Exemplo Passo a Passo: O Contador de XP
- Importe as ferramentas de estado:
runtime.*. - Crie a variável de estado dentro da função
@Composable. - Use o comando
bypara facilitar a vida (exige import degetValueesetValue).
@Composable
fun TelaTreino() {
// 1. Criando a memória da tela
var xp by remember { mutableStateOf(0) }
Column(modifier = Modifier.padding(20.dp)) {
Text(text = "Seu XP Atual: $xp", fontSize = 30.sp)
// 2. O botão que muda o valor
Button(onClick = { xp += 10 }) {
Text("Treinar (+10 XP)")
}
}
}🛠️ Prática Obrigatória 1:
Crie uma variável de estado chamada vidaInimigo começando com 100. Crie um botão “Atacar” que subtraia 5 da vida a cada clique. Mostre a vida na tela.
🛠️ Prática Obrigatória 2:
Adicione um if: Se a vida do inimigo for menor ou igual a zero, o texto na tela deve mudar de “Inimigo Ativo” para ”🏆 INIMIGO DERROTADO!“.
🔑 Gabarito Passo a Passo:
@Composable
fun ArenaBatalha() {
var vidaInimigo by remember { mutableStateOf(100) }
Column {
if (vidaInimigo > 0) {
Text("Vida do Boss: $vidaInimigo")
Button(onClick = { vidaInimigo -= 5 }) {
Text("Atacar!")
}
} else {
Text("🏆 INIMIGO DERROTADO!", color = Color.Green)
}
}
}📤 Instruções de Entrega (Microsoft Teams):
- Envie o código da sua tela de Arena.
- Nomeie como:
Gamer_SeuNome_Cap07.kt. - Submeta no canal de tarefas.