Push/pop, cabeçalhos e opções de tela em diretórios app/. Stack do expo-router é a interface baseada em arquivos do @react-navigation/native-stack - cada arquivo de rota irmão sob uma pasta com _layout.tsx se torna uma tela de pilha.
app/orders/_layout.tsx → <Stack> envolve esta pastaapp/orders/index.tsx → rota inicial (fundo da pilha)app/orders/[id].tsx → empurrado ao navegar para /orders/:idapp/orders/new.tsx → empurrado ao navegar para /orders/new
Expo Router registra automaticamente cada arquivo de rota como um Stack.Screen - <Stack.Screen name="..."> explícito é opcional, mas recomendado para opções
A rota inicial é a primeira tela correspondente na navegação; deep links podem abrir [id] diretamente
Arquivos irmãos compartilham um histórico de pilha - pastas sem _layout.tsx herdam o navegador pai
(tabs)/_layout.tsx → Abas (barra de abas sempre visível)(tabs)/orders/_layout → Pilha (push apenas dentro da aba Pedidos)
Cada aba mantém um histórico de pilha independente - alternar abas preserva o estado da pilha de cada aba por padrão. Reinicie as pilhas ao sair com router.replace ou remontando a chave do navegador.
_layout.tsx ausente em uma pasta com várias telas - irmãos podem se achatar inesperadamente na pilha pai. Correção: Adicione orders/_layout.tsx com <Stack /> quando uma pasta tiver index + [id].
Nomes de tela duplicados de arquivos index - orders.tsx e orders/index.tsx entram em conflito. Correção: Escolha uma forma de URL por recurso.
headerShown: false na pilha raiz, mas esperando cabeçalhos aninhados - pilhas filhas devem definir headerShown: true explicitamente. Correção: Configure cabeçalhos no _layout.tsx aninhado onde as telas residem.
Piscada de título dinâmico - o título padrão é exibido antes que a busca seja concluída. Correção: Use um título esqueleto ou headerLargeTitle: false até que os dados sejam carregados; defina opções em useEffect.
router.push após o login duplica a autenticação na pilha de volta - os usuários deslizam para voltar para o login. Correção:router.replace('/(tabs)') após autenticação bem-sucedida.
Modal sem tratamento de back do Android - presentation: "modal" ainda respeita o back do hardware, mas sobreposições personalizadas podem não. Correção: Teste o back do Android; prefira rotas reais em vez de sobreposições de posição absoluta.
Deep link abre a pilha no meio da árvore sem índice - /orders/99 pode pular a tela da lista. Correção: Aceitável para notificações; use UI de fallback router.back() quando a pilha estiver vazia.
// Em _layout.tsx<Stack.Screen name="login" options={{ headerShown: false }} />// Ou exporte do arquivo de rotaexport const options = { headerShown: false };
Defina headerShown: false na tela específica - screenOptions pai ainda pode ser aplicado a irmãos.
Como adiciono um botão direito no cabeçalho?
import { Stack, router } from "expo-router";import { Pressable, Text } from "react-native";export default function EditScreen() { return ( <> <Stack.Screen options={{ headerRight: () => ( <Pressable onPress={() => router.push("/preview")}> <Text>Pré-visualizar</Text> </Pressable> ), }} /> {/* corpo da tela */} </> );}
Use props de renderização headerLeft, headerRight ou headerTitle - mesma API do React Navigation.
Posso usar um componente de cabeçalho personalizado?
Sim - header: () => <MyHeader /> nas opções da tela. Prefira cabeçalhos de sistema de design para consistência. Oculte o padrão com headerShown: false e renderize o seu próprio no corpo da tela apenas quando o cabeçalho da pilha for insuficiente.
Como funciona o botão de voltar do hardware Android?
O botão de voltar do hardware remove a pilha atual. Na primeira tela da pilha raiz, o botão de voltar sai do aplicativo (ou vai para o plano de fundo). Teste pilhas aninhadas dentro de abas - o botão de voltar deve remover o detalhe antes de alternar as abas.
Como reinicio a pilha no logout?
import { router } from "expo-router";router.replace("/(auth)/login");
replace remove rotas anteriores do histórico. Para reinícios complexos, remonte o navegador com uma key vinculada a userId no layout raiz.
Modais devem ser rotas ou React Native Modal?
Rotas quando o modal tem uma URL, deep link ou deve aparecer no histórico de navegação. RN Modal para UI efêmera sem caminho compartilhável. Documente a escolha da equipe em um ADR quando ambos os padrões aparecerem.
Como passo dados entre telas da pilha?
Parâmetros de URL para IDs e estado superficial (params: { id })
Armazenamento global (Zustand, TanStack Query) para entidades compartilhadas
Evite JSON grande em parâmetros - URLs são registradas e persistidas no estado de navegação
animation: "slide_from_right" | "fade" | "fade_from_bottom" | "flip" | "simple_push" | "none" em screenOptions. Os padrões da plataforma diferem - verifique em simuladores iOS e Android.
Posso aninhar uma pilha dentro de outra pilha?
Sim - app/settings/_layout.tsx pode exportar <Stack> enquanto está dentro da pilha raiz. Limite a profundidade para duas pilhas (raiz + recurso) antes que a experiência do usuário e a depuração sofram.
Como desabilito o swipe-back em uma tela sensível?