🧩 Exercícios - Cap 11: Navegação entre Fases (Menus)
🎯 Antes de começar
No Cap 11 você criou o NavegadorDoJogo() com NavHost + composable(...), e nas Práticas Obrigatórias montou as rotas "inicio" → "arena" → "vitoria" com navController.navigate(...) e popBackStack(). Depois de completar as duas Práticas, faça o exercício extra abaixo para conhecer popUpTo, que controla o histórico de navegação.
💪 Exercício Extra 1: Botão “Menu Principal” com popUpTo (20 min)
Objetivo: Praticar popUpTo, que limpa telas do histórico ao navegar — evitando que o jogador acumule um “empilhado” de telas antigas.
Passos:
- Na tela
"vitoria", abaixo do botão “Voltar”, adicione um segundo botão:Button(onClick = { navController.navigate("inicio") { popUpTo("inicio") { inclusive = false } } }) { Text("Menu Principal") } - Rode o app, siga o fluxo
"inicio"→"arena"→"vitoria". - Na tela
"vitoria", toque em “Menu Principal”. - Agora pressione o botão Voltar do celular/emulador.
✅ Resultado Esperado
- Ao tocar em “Menu Principal”, o app volta direto para
"inicio". - Ao pressionar Voltar a partir de
"inicio", o app fecha (sai do aplicativo) — porquepopUpTo("inicio")removeu"arena"e"vitoria"do histórico, então não há mais telas anteriores para voltar. - Compare com o botão “Voltar” do Cap 11 (
popBackStack()): ele volta uma tela por vez, mantendo o histórico;popUpTolimpa o histórico até a rota indicada.
🆘 Resolução de Problemas Comuns
| Erro | Causa | Solução |
|---|---|---|
Unresolved reference: popUpTo |
popUpTo é usado dentro do bloco { } de navigate(...), não como função separada |
Confirme a sintaxe navController.navigate("inicio") { popUpTo("inicio") { inclusive = false } } |
| App fecha imediatamente ao abrir | Trocou o startDestination por engano, ou apagou a rota "inicio" |
Confirme que NavHost(... startDestination = "inicio") e que composable("inicio") { ... } ainda existe |
| Botão “Voltar” não fecha o app, volta para “vitoria” | popUpTo não foi aplicado, ou inclusive está com valor errado |
Revise se o botão “Menu Principal” usa o bloco popUpTo("inicio") { inclusive = false } exatamente como no exemplo |