Atividade 12: Navegação em Pilha (Stack)
Como uma pilha de pratos! Colocamos uma tela por cima da outra, e o botão "Voltar" tira a tela de cima.
Dica importante: nesta atividade, você vai continuar no mesmo projeto Expo iniciado na Atividade 11. Esse mesmo projeto também será reaproveitado nas Atividades 13, 14 e 15.
🎯 Objetivos desta aula
- ✓ Entender a metáfora real de "Stack" (Pilha).
-
✓
Uso da função
router.push()para viagens programáticas via código. - ✓ Entender o Header Nativado (O famigerado título com setinha no topo da tela).
📚 O que é o "Stack"?
A Navegação em Pilha é o padrão mais comum em aplicativos móveis. Quando você clica num post de Instagram, a tela "Detalhes do Post" desliza por cima do "Feed". Se você clica no perfil do autor, a tela "Perfil" desliza por cima do "Post". Você empilhou 3 telas (Feed > Post > Perfil). O botão nativo de "Voltar" do celular tira a tela "Perfil" e o usuário vê a tela de baixo de novo (Post).
Viajando sem componente <Link>
Na aula passada usamos a Tag Link. Mas e se quisermos
viajar após o usuário fazer Login apertando um Button? Usamos lógica! O useRouter nos permite programar a viagem:
import { useRouter } from 'expo-router';
// Dentro do componente...
const router = useRouter();
const fazerLogin = () => {
router.push('/painel');
}
Substituindo Histórico (Replace)
Ao fazer push('/...', ...) nós "Empilhamos"
mantendo a tela anterior viva embaixo. Quando queremos MATAR a tela anterior (ex: Logou não
pode apertar Voltar pra ver Login de novo) nós substituímos a pilha principal!
// Mata histórico e abre a painel
router.replace('/painel');
O arquivo mestre: _layout.js
O Expo Router procura por um arquivo especial chamado _layout.js dentro das pastas para saber "como empacotar e construir
os Cabeçalhos" das telas daquela pasta. É lá que customizamos o títulozinho do topo (A barra
cinza do celular).
💻 Exemplo com Expo Router
Este exemplo é compatível com desenvolvimento local em Expo no PC. Aqui usamos Expo Router diretamente, porque é esse o fluxo que o aluno vai usar no projeto real. O React Navigation continua existindo por baixo, mas quem nós configuramos no dia a dia é o Expo Router.
Dica: você pode reutilizar a estrutura da Atividade 11. Não precisa criar outro projeto do zero; basta continuar no mesmo app e atualizar os arquivos.
import { Stack } from 'expo-router';
export default function Layout() {
return (
<Stack>
<Stack.Screen
name="index"
options={{
title: 'Início',
headerStyle: { backgroundColor: '#0f172a' },
headerTintColor: '#ffffff'
}}
/>
<Stack.Screen
name="detalhes"
options={{ title: 'Mais informações' }}
/>
</Stack>
);
}
import { View, Text, Button, StyleSheet } from 'react-native';
import { useRouter } from 'expo-router';
export default function Home() {
const router = useRouter();
return (
<View style={[styles.container, { backgroundColor: '#e0f2fe' }]}>
<Text style={styles.texto}>Você está na BASE DA PILHA</Text>
<Button
title="Empilhar tela sobre mim!"
onPress={() => router.push('/detalhes')}
/>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center'
},
texto: {
fontSize: 18,
marginBottom: 20,
fontWeight: 'bold'
}
});
import { View, Text, Button, StyleSheet } from 'react-native';
import { useRouter } from 'expo-router';
export default function Detalhes() {
const router = useRouter();
return (
<View style={[styles.container, { backgroundColor: '#fed7aa' }]}>
<Text style={styles.texto}>Detalhes (em cima da pilha!)</Text>
<Button
title="Voltar para baixo"
onPress={() => router.back()}
/>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center'
},
texto: {
fontSize: 18,
marginBottom: 20,
fontWeight: 'bold'
}
});
🎮 Desafios Práticos
Teste o arquivo acima no projeto local e perceba como o Expo Router monta a pilha e o botão de voltar automaticamente quando a estrutura de arquivos está correta.
Modificar 🛠️
- No arquivo
app/_layout.js, altere o título da teladetalhesde "Mais informações" para um texto bem grande, como "Super Configurações do Sistema Master Detalhe". O que acontece com a setinha de voltar se faltar espaço?
Melhorar 🚀
Customizando a barra nativa do topo (Header).
- No arquivo
app/_layout.js, localize asoptionsda telaindexe injete propriedades para pintar as letras e o fundo do Header: - Nas opções da tela
index, mude de:options={{ title: 'Início' }}PARAoptions={{ title: 'Início', headerStyle: { backgroundColor: '#f4511e' }, headerTintColor: '#fff' }}.
Criar ✨
Empilhando uma terceira tela com Expo Router.
- Crie um novo arquivo
app/super-detalhes.jse faça ele retornar uma View verde (#bbf7d0). - No
app/_layout.js, registre a tela com<Stack.Screen name="super-detalhes" />. - Depois volte em
app/detalhes.jse adicione um botão comrouter.push('/super-detalhes')para empilhar a nova tela. Depois teste os botões de voltar.