🧩 Exercícios - Cap 09: Vida Reativa (Estado no Compose)
🎯 Antes de começar
No Cap 09 você criou a “Arena de Treino” com var vidaInimigo by remember { mutableStateOf(100) } e um botão “Atacar” que diminui a vida (Prática 1), além de um if que troca o texto quando o inimigo é derrotado (Prática 2). Depois de completar as duas Práticas, faça o exercício extra abaixo para praticar estado + if limitando um valor (impedir que ele passe de um máximo).
💪 Exercício Extra 1: Botão de Cura com Limite Máximo (15 min)
Objetivo: Combinar remember/mutableStateOf com if para impedir que um valor de estado passe de um limite (vida máxima = 100).
Passos:
- Crie uma nova função
@Composable fun TelaCura() { ... }comvar vidaJogador by remember { mutableStateOf(50) }. - Mostre o valor:
Text("Vida do Jogador: $vidaJogador / 100"). - Adicione um botão que cura
+20, mas sem passar de 100:Button(onClick = { vidaJogador = if (vidaJogador + 20 > 100) 100 else vidaJogador + 20 }) { Text("Curar (+20 HP)") } - Rode na Preview/emulador e clique várias vezes no botão.
✅ Resultado Esperado
- Valor inicial:
"Vida do Jogador: 50 / 100". - Após 1 clique:
70. Após 2 cliques:90. - Após 3 cliques:
100(não110) — e continua100em cliques seguintes.
🆘 Resolução de Problemas Comuns
| Erro | Causa | Solução |
|---|---|---|
Val cannot be reassigned ao clicar no botão |
A variável de estado foi criada com val em vez de var |
Use var vidaJogador by remember { mutableStateOf(50) } |
| A tela não atualiza ao clicar (número parado) | Faltou a palavra by, então vidaJogador é um objeto MutableState<Int>, não um Int direto |
Use by remember { ... } (com by), e confira o import de getValue/setValue (androidx.compose.runtime.*) |
O valor passa de 100 (ex.: chega a 110, 130…) |
A condição do if está invertida ou ausente |
Confira: if (vidaJogador + 20 > 100) 100 else vidaJogador + 20 |