Stack Navigator — un componente de la librería React Navigation para gestionar pantallas de aplicaciones móviles mediante el principio de pila (LIFO). Cada nueva pantalla se coloca encima de la anterior, y el botón «Atrás» elimina la pantalla superior y devuelve al usuario a la anterior. Más información sobre la arquitectura de navegación en la documentación oficial de React Navigation.
Puntos clave
Stack Navigator es uno de los navegadores básicos de la librería React Navigation que implementa el modelo de pila de pantallas. Proporciona la navegación familiar para los usuarios de móviles: abrir una nueva pantalla se acompaña de una animación de deslizamiento hacia la derecha, y el botón «Atrás» o el gesto de deslizar devuelve a la pantalla anterior. Stack Navigator es compatible con iOS y Android, utilizando componentes nativos de la plataforma para un máximo rendimiento.
React Navigation es la librería de navegación más popular para React Native, instalada en el 85 % de los proyectos (según datos de npm, 2026). Stack Navigator forma parte de su núcleo y está disponible en dos implementaciones: createNativeStackNavigator (nativa, recomendada) y createStackNavigator (JavaScript, para animaciones personalizadas complejas). La versión nativa apareció en React Navigation v5 y se convirtió en el estándar en v6+.
La principal ventaja de Stack Navigator es el comportamiento natural que conocen los usuarios de iOS y Android. En iOS, la pila se representa visualmente con UINavigationController, en Android — con FragmentManager y animación de deslizamiento. El desarrollador no necesita implementar la lógica de pila manualmente — el navegador gestiona los estados de las pantallas, la pila de retroceso y las animaciones automáticamente.
La navegación por pila se basa en el principio LIFO (Last In, First Out). Cuando un usuario abre una nueva pantalla, el navegador la coloca en la cima de la pila. Al presionar «Atrás», la pantalla superior se elimina y el usuario ve la anterior. La pila puede contener cualquier número de pantallas — el único límite es la memoria del dispositivo.
Cada pantalla en la pila conserva su estado. Al volver a una pantalla anterior, su estado se restaura automáticamente. Esto diferencia la pila de otros tipos de navegación (Tab, Drawer), donde las pantallas pueden recrearse. React Navigation gestiona el estado mediante su propio mecanismo de contexto de navegación.
| Acción | Resultado | Ejemplo |
|---|---|---|
| navigate | Coloca una pantalla en la cima de la pila | navigation.navigate('Profile') |
| goBack | Elimina la pantalla superior de la pila | navigation.goBack() |
| push | Agrega una nueva pantalla de forma forzada | navigation.push('Profile') |
| popToTop | Vuelve a la pantalla raíz | navigation.popToTop() |
| reset | Reemplaza toda la pila con un nuevo conjunto | navigation.reset({ index: 0, routes: [...] }) |
En iOS, Stack Navigator admite un gesto de deslizar desde el borde izquierdo para retroceder — este es el comportamiento estándar de iOS que los usuarios esperan. En Android, el gesto está desactivado por defecto, pero se puede activar mediante la opción gestureEnabled. En Native Stack, el gesto funciona de forma nativa sin retrasos del hilo de JavaScript.
React Navigation ofrece dos tipos de Stack Navigator: Native Stack (createNativeStackNavigator) y JS Stack (createStackNavigator). La principal diferencia es dónde se ejecuta la animación. Native Stack utiliza los controladores de animación nativos de iOS y Android, mientras que JS Stack funciona a través del hilo de JavaScript de React Native. La elección entre ellos depende de los requisitos de rendimiento y personalización.
Native Stack está recomendado para la mayoría de los proyectos. Proporciona animaciones fluidas a 60 FPS sin bloquear el hilo JS, admite el gesto de retroceso del sistema en iOS y utiliza transiciones nativas — slide en iOS, fade en Android. Sin embargo, Native Stack tiene limitaciones en la personalización de animaciones: solo está disponible un conjunto predefinido de transiciones.
JS Stack ofrece control total sobre las animaciones mediante cardStyleInterpolator. El desarrollador puede crear cualquier animación: escalado, rotación, paralaje, curvas personalizadas. La desventaja es que las animaciones se ejecutan en el hilo JS, lo que puede causar caídas de fotogramas en dispositivos débiles con transiciones complejas. Para el 70 % de los proyectos, Native Stack es más que suficiente.
// Native Stack — implementación recomendada
import { createNativeStackNavigator } from '@react-navigation/native-stack';
type RootStackParamList = {
Home: undefined;
Profile: { userId: string; name: string };
Settings: undefined;
};
const Stack = createNativeStackNavigator<RootStackParamList>();
function AppNavigator() {
return (
<Stack.Navigator screenOptions={{ headerShown: true }}>
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Profile" component={ProfileScreen} />
<Stack.Screen name="Settings" component={SettingsScreen} />
</Stack.Navigator>
);
}Para empezar con Stack Navigator, es necesario instalar React Navigation y sus dependencias. El conjunto mínimo incluye @react-navigation/native, @react-navigation/native-stack y react-native-screens. Tras la instalación, la aplicación se envuelve en NavigationContainer — un contexto que proporciona el estado de navegación a todos los componentes hijos.
# Instalación de dependencias de React Navigation
npm install @react-navigation/native @react-navigation/native-stack
npm install react-native-screens react-native-safe-area-context
# Para iOS — instalación de pod
cd ios && pod install && cd ..Después de la instalación, se crea Stack.Navigator con pantallas específicas definidas en RootStackParamList. Cada pantalla se vincula a un componente de React mediante la prop component. El navegador puede ser raíz o estar anidado dentro de otro navegador (Tab, Drawer). Para la configuración se utilizan screenOptions — comunes para todas las pantallas o individuales para cada una.
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
type RootStackParamList = {
Home: undefined;
Details: { itemId: number; title: string };
};
const Stack = createNativeStackNavigator<RootStackParamList>();
export default function App() {
return (
<NavigationContainer>
<Stack.Navigator initialRouteName="Home"
screenOptions={{
headerStyle: { backgroundColor: '#6200ee' },
headerTintColor: '#fff',
gestureEnabled: true,
}}>
<Stack.Screen name="Home" component={HomeScreen}
options={{ title: 'Inicio' }} />
<Stack.Screen name="Details" component={DetailsScreen}
options={({ route }) => ({ title: route.params.title })} />
</Stack.Navigator>
</NavigationContainer>
);
}Stack Navigator proporciona muchas opciones para personalizar la apariencia y el comportamiento. Los parámetros principales se definen mediante screenOptions a nivel de Navigator u options a nivel de Screen. El desarrollador puede configurar el encabezado, la animación de transición, el gesto de deslizamiento, el estilo de la tarjeta y el oscurecimiento del fondo. La flexibilidad de la configuración permite adaptar la navegación al sistema de diseño de la aplicación.
| Opción | Tipo | Descripción |
|---|---|---|
| headerShown | boolean | Mostrar u ocultar el encabezado de la pantalla |
| headerStyle | object | Estilo de la barra de encabezado (backgroundColor, elevation) |
| headerBackTitle | string | Texto del botón «Atrás» (iOS) |
| gestureEnabled | boolean | Activar el gesto de deslizar para retroceder |
| animation | string | Tipo de animación: slide_from_right, fade, none |
| contentStyle | object | Estilo del área interna de la pantalla |
Para JS Stack, cardStyleInterpolator permite crear animaciones de transición arbitrarias entre pantallas. Es una herramienta potente para implementar efectos visuales únicos: escalado, rotación, paralaje, giro horizontal. La función recibe los valores actuales del progreso de la animación (current, next) y devuelve estilos para los elementos que se están animando.
Stack Navigator admite el tipado completo mediante TypeScript. Para ello, se define RootStackParamList — un tipo objeto donde las claves son los nombres de las pantallas y los valores son los tipos de parámetros. Después del tipado, navigation.navigate y route.params obtienen autocompletado y verificación de tipos. Esto elimina los errores de paso de parámetros en tiempo de compilación.
type RootStackParamList = {
Home: undefined;
Product: { id: string; category: string };
Checkout: { items: CartItem[]; total: number };
};
// Pantalla tipada
type ProductScreenProps = NativeStackScreenProps<RootStackParamList, 'Product'>;
function ProductScreen({ navigation, route }: ProductScreenProps) {
const { id, category } = route.params;
return (
<View>
<Text>Producto {id} — {category}</Text>
<Button title="Agregar al carrito"
onPress={() => navigation.navigate('Checkout', {
items: [{ id, quantity: 1 }],
total: 99.99,
})} />
</View>
);
}Stack Navigator admite la agrupación de pantallas y ventanas modales. Los grupos (Screen Group) permiten aplicar configuraciones comunes a varias pantallas sin duplicación. Las ventanas modales se implementan mediante stack presentation: 'modal' — la pantalla se abre desde abajo con oscurecimiento del fondo, como un modal del sistema en iOS. Esta opción solo está disponible en Native Stack.
Para navegación compleja, Stack Navigator puede anidarse dentro de un Tab Navigator o Drawer Navigator. Por ejemplo, la pestaña «Inicio» tiene su propia pila de pantallas, y la pestaña «Perfil» tiene la suya. Esta composición de navegadores es el enfoque estándar para aplicaciones de producción. Cada pila está aislada: la pila de retroceso dentro de una pestaña no afecta a otras pestañas.
// Pila anidada en Tab Navigator
const HomeStack = createNativeStackNavigator<HomeStackParamList>();
function HomeStackScreen() {
return (
<HomeStack.Navigator>
<HomeStack.Screen name="Feed" component={FeedScreen} />
<HomeStack.Screen name="PostDetail" component={PostDetailScreen}
options={{ presentation: 'modal' }} />
</HomeStack.Navigator>
);
}
// Grupos de pantallas con opciones compartidas
<Stack.Navigator>
<Stack.Group screenOptions={{ headerShown: true }}>
<Stack.Screen name="Main" component={MainScreen} />
<Stack.Screen name="About" component={AboutScreen} />
</Stack.Group>
<Stack.Screen name="Auth" component={AuthScreen}
options={{ presentation: 'modal', headerShown: false }} />
</Stack.Navigator>Preguntas frecuentes
navigate primero busca una pantalla existente con ese nombre en la pila y navega a ella si la encuentra. push siempre agrega una nueva pantalla a la cima de la pila, incluso si ya existe una. push es útil cuando necesitas abrir la misma pantalla con datos diferentes (por ejemplo, un perfil de usuario).
Los parámetros se pasan como segundo argumento del método navigate: navigation.navigate('Profile', { userId: '123', name: 'John' }). En la pantalla receptora, los parámetros están disponibles mediante route.params. Los tipos de parámetros se definen en RootStackParamList para el autocompletado en TypeScript.
Stack Navigator es adecuado para navegación lineal (pantalla → detalles → edición). Tab Navigator es para secciones paralelas de la aplicación (Inicio, Búsqueda, Perfil). En proyectos de producción, se combinan: Tab Navigator contiene varios Stack Navigator para cada pestaña.
Por defecto, Stack Navigator agrega un botón «Atrás» en el encabezado para todas las pantallas excepto la raíz. En iOS, también funciona el gesto de deslizar desde el borde izquierdo. El método navigation.goBack() elimina la pantalla actual de la pila y devuelve al usuario a la anterior.
Native Stack proporciona animaciones predefinidas: slide_from_right, fade, none. Para una personalización completa, se utiliza JS Stack con cardStyleInterpolator — una función que devuelve estilos de tarjeta en cada fotograma de la animación. Esto permite crear cualquier transición: escalado, paralaje, rotación 3D.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también