Pantallas de destino predeterminadas y puntos de entrada con control de autenticación. Los archivos index.tsx definen rutas predeterminadas para su carpeta; <Redirect /> y router.replace envían a los usuarios a la interfaz correcta sin contaminar la pila de navegación.
1. Root _layout monta SessionProvider2. app/index.tsx espera a que isLoading === false3. session ? Redirect → /(tabs) : Redirect → /login4. (app)/_layout.tsx recomprueba la sesión (protección de enlace profundo)5. Éxito de inicio de sesión → router.replace("/(tabs)")6. Cierre de sesión → router.replace("/login")
Protección doble - centro raíz + (app)/_layout captura enlaces profundos a /settings cuando no estás registrado
UI de carga - nunca redirijas mientras la sesión se hidrata; evita el parpadeo de la pantalla de inicio de sesión
Usuario registrado en /login - opcionalmente redirige a /(tabs) desde (auth)/_layout.tsx
Redirigir antes de la hidratación de sesión - los usuarios parpadean a través de inicio de sesión → inicio → inicio de sesión. Solución: Puerta isLoading con spinner o splash.
Dos rutas de índice en / - (auth)/index.tsx y (app)/index.tsx entran en conflicto. Solución: Centro app/index.tsx único.
router.push después del inicio de sesión - deslizar atrás expone credenciales. Solución:router.replace.
Bucle de redirección infinita - el diseño (app) redirige a /login mientras el inicio de sesión redirige a /(tabs) antes de que la sesión se actualice. Solución: Asegúrate de que signIn establezca la sesión antes de router.replace.
Enlace profundo a ruta protegida - /settings omite el centro. Solución: Protege en (app)/_layout.tsx, no solo app/index.tsx.
Redirigir en cada pantalla secundaria - lógica duplicada diverge. Solución: Redirect a nivel de diseño una vez por grupo.
href="/(tabs)" vs href="/" - ambos pueden funcionar pero significan cosas diferentes cuando cambian los grupos. Solución: Preferir ruta de pestaña explícita; usar Href tipado.
¿Cuál es la diferencia entre índice y redirección?
El índice es una pantalla real en la ruta predeterminada de una carpeta. La redirección envía la navegación a otra parte sin renderizar contenido. Usa app/index.tsx como un centro de redirección delgado; coloca la UI de inicio en (tabs)/index.tsx.
¿Redirección vs router.replace?
<Redirect> es declarativo - renderiza cuando la condición es verdadera. router.replace es imperativo - llama después de que signIn() se complete. Ambos evitan entradas en la pila de navegación cuando se configuran correctamente.
¿Cómo evito volver al inicio de sesión después de registrarme?
router.replace("/(tabs)");
Nunca hagas push a la aplicación principal desde el inicio de sesión. Borra la pila de autenticación con replace.
¿Cómo manejo el cierre de sesión?
await clearTokens();router.replace("/login");
También queryClient.clear() y reinicia las pilas de pestañas - remonta con key en el diseño raíz si es necesario.
¿Puedo redirigir a una URL externa?
Usa expo-linkingopenURL para sitios externos. <Redirect> es solo para rutas dentro de la aplicación.
¿Cómo funcionan las redirecciones basadas en roles?
Encadena las condiciones en app/index.tsx - ordenadas de más específica a predeterminada.
¿Cómo funcionan las rutas de índice en carpetas anidadas?
app/orders/index.tsx sirve /orders. Navegar a /orders muestra la lista; /orders/42 empuja [id].tsx en la pila de órdenes.
¿Deben los usuarios registrados acceder a /login?
Opcionalmente redirige en (auth)/_layout.tsx:
if (session) return <Redirect href="/(tabs)" />;
Previene la pantalla de inicio de sesión marcada cuando ya está autenticado.
¿Cómo pruebo la lógica de redirección?
Usa expo-router/testing-libraryrenderRouter con proveedores de sesión simulados. Afirma destinos Redirect inspeccionando el estado de navegación después de waitFor.