Telas de destino padrão e pontos de entrada com acesso restrito por autenticação. Arquivos index.tsx definem as rotas padrão para suas pastas; <Redirect /> e router.replace enviam os usuários para a estrutura correta sem poluir a pilha de retorno.
Redirecionamento antes da hidratação da sessão - os usuários piscam através de login → início → login. Correção: Porta isLoading com spinner ou splash.
Dois índices de rota em / - (auth)/index.tsx e (app)/index.tsx entram em conflito. Correção: Hub único app/index.tsx.
router.push após o login - o retorno por gesto expõe as credenciais. Correção:router.replace.
Loop de redirecionamento infinito - (app) layout redireciona para /login enquanto o login redireciona para /(tabs) antes que a sessão seja atualizada. Correção: Garanta que signIn defina a sessão antes de router.replace.
Link direto para rota protegida - /settings ignora o hub. Correção: Proteção em (app)/_layout.tsx, não apenas em app/index.tsx.
Redirecionamento em cada tela filha - a lógica duplicada se desvia. Correção:<Redirect> no nível do layout uma vez por grupo.
href="/(tabs)" vs href="/" - ambos podem funcionar, mas significam coisas diferentes quando os grupos mudam. Correção: Prefira o caminho raiz da aba explícito; use Href tipado.
Qual é a diferença entre índice e redirecionamento?
Índice é uma tela real no caminho padrão de uma pasta. Redirecionamento envia a navegação para outro lugar sem renderizar conteúdo. Use app/index.tsx como um hub de redirecionamento fino; coloque a UI da página inicial em (tabs)/index.tsx.
Redirecionamento vs router.replace?
<Redirect> é declarativo - renderiza quando a condição é verdadeira. router.replace é imperativo - chame após signIn() ser concluído. Ambos evitam entradas na pilha de retorno quando configurados corretamente.
Como evito o retorno para o login após o login?
router.replace("/(tabs)");
Nunca use push para o aplicativo principal a partir do login. Limpe a pilha de autenticação com replace.
Como faço o logout?
await clearTokens();router.replace("/login");
Também queryClient.clear() e reinicie as pilhas de abas - remonte com key no layout raiz, se necessário.
Posso redirecionar para uma URL externa?
Use expo-linkingopenURL para sites externos. <Redirect> é apenas para rotas dentro do aplicativo.
Como funcionam os redirecionamentos baseados em função?
Encadeie condições em app/index.tsx - ordenadas da mais específica para a padrão.
Como funcionam as rotas de índice em pastas aninhadas?
app/orders/index.tsx serve /orders. Navegar para /orders mostra a lista; /orders/42 empurra [id].tsx na pilha de pedidos.
Usuários logados devem acessar /login?
Opcionalmente redirecione em (auth)/_layout.tsx:
if (session) return <Redirect href="/(tabs)" />;
Impede a tela de login marcada nos favoritos quando já autenticado.
Como testo a lógica de redirecionamento?
Use expo-router/testing-libraryrenderRouter com provedores de sessão mockados. Afirme os destinos de Redirect inspecionando o estado de navegação após waitFor.