Implementando y Entendiendo Stack Navigation en React Native: Un Ejemplo Paso a Paso
En este blog, aprenderás cómo usar Stack Navigation en React Native de manera efectiva. Vamos a desglosar un ejemplo completo que incluye navegación entre pantallas, uso de un botón personalizado, y una configuración robusta para gestionar rutas en tu aplicación.
¿Qué es Stack Navigation?
Stack Navigation organiza las pantallas de tu aplicación en una pila (o stack). Cada pantalla nueva se apila sobre la anterior, permitiendo navegar hacia adelante y atrás con facilidad. Este patrón es común en aplicaciones móviles modernas, donde los usuarios navegan entre pantallas con encabezados y transiciones suaves.
Con React Navigation, puedes configurar fácilmente Stack Navigation en tu aplicación React Native.
Configuración Inicial del Proyecto
Antes de comenzar con el código, asegúrate de haber instalado las dependencias necesarias:
npm install @react-navigation/native @react-navigation/stack react-native-gesture-handler react-native-screens react-native-safe-area-context react-native-masked-view react-native-paper
Estructura del Proyecto
Organizar tu proyecto es clave para mantener un código limpio y escalable. La estructura de nuestro ejemplo será la siguiente:
src/
├── presentation/
│ ├── components/
│ │ └── shared/
│ │ └── PrimaryButton.tsx # Botón personalizado
│ ├── routes/
│ │ └── StackNavigator.tsx # Configuración de navegación
│ ├── screens/
│ │ ├── home/
│ │ │ └── HomeScreen.tsx # Pantalla principal
│ │ ├── products/
│ │ │ └── ProductsScreen.tsx # Pantalla de productos
│ │ └── settings/
│ │ └── SettingsScreen.tsx # Pantalla de configuración
├── App.tsx
1. Creando un Botón Personalizado: PrimaryButton
Comencemos con el botón reutilizable. Este componente nos permitirá navegar entre las pantallas:
// src/presentation/components/shared/PrimaryButton.tsx
import React from 'react';
import { Pressable, StyleSheet } from 'react-native';
import { Text } from 'react-native-paper';
interface Props {
text: string;
onPress: () => void;
}
export const PrimaryButton = ({ onPress, text }: Props) => {
return (
<Pressable style={styles.button} onPress={onPress}>
<Text style={styles.textButton}>{text}</Text>
</Pressable>
);
};
const styles = StyleSheet.create({
button: {
backgroundColor: 'purple',
margin: 16,
padding: 16,
borderRadius: 4,
},
textButton: {
color: 'white',
fontWeight: 'bold',
},
});
Explicación de Props
text
: El texto que aparecerá en el botón.onPress
: Una función que se ejecuta cuando el botón es presionado.
Diseño del Botón
backgroundColor: 'purple'
: Da un color púrpura al botón.padding: 16
: Aumenta el área de clic del botón.borderRadius: 4
: Redondea las esquinas del botón.
2. Configurando Stack Navigation
Crea el archivo de configuración de navegación donde se definen las rutas y pantallas:
// src/presentation/routes/StackNavigator.tsx
import { createStackNavigator } from '@react-navigation/stack';
import { HomeScreen } from '../screens/home/HomeScreen';
import { ProductsScreen } from '../screens/products/ProductsScreen';
import { SettingsScreen } from '../screens/settings/SettingsScreen';
const Stack = createStackNavigator();
export const StackNavigator = () => {
return (
<Stack.Navigator
screenOptions={{
headerShown: true,
headerStyle: {
elevation: 0,
shadowColor: 'transparent',
},
}}
>
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Products" component={ProductsScreen} />
<Stack.Screen name="Settings" component={SettingsScreen} />
</Stack.Navigator>
);
};
Propiedades Importantes
-
screenOptions
: Configura las opciones generales de las pantallas.headerShown
: Si estrue
, muestra un encabezado en cada pantalla.headerStyle
: Personaliza el estilo del encabezado.elevation: 0
: Elimina la sombra en Android.shadowColor: 'transparent'
: Elimina la sombra en iOS.
-
Stack.Screen
: Define cada pantalla en la pila.name
: Identificador único de la pantalla.component
: El componente que se renderiza en esa pantalla.
3. Creando la Pantalla Principal: HomeScreen
Ahora, define la pantalla inicial que mostrará los botones para navegar:
// src/presentation/screens/home/HomeScreen.tsx
import React from 'react';
import { PrimaryButton } from '../../components/shared/PrimaryButton';
import { View } from 'react-native';
import { useNavigation } from '@react-navigation/native';
export const HomeScreen = () => {
const navigation = useNavigation();
return (
<View>
<PrimaryButton
onPress={() => navigation.navigate('Products' as never)}
text="Productos"
/>
<PrimaryButton
onPress={() => navigation.navigate('Settings' as never)}
text="Settings"
/>
</View>
);
};
Uso de useNavigation
useNavigation
: Un hook que permite acceder al objeto de navegación dentro del componente.navigate('Products')
: Navega a la pantallaProducts
.navigate('Settings')
: Navega a la pantallaSettings
.
4. Integrando Stack Navigator en App.tsx
Finalmente, integra la navegación en tu archivo principal:
// App.tsx
import React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { StackNavigator } from './presentation/routes/StackNavigator';
export const App = () => {
return (
<NavigationContainer>
<StackNavigator />
</NavigationContainer>
);
};
NavigationContainer
: Envuelve toda tu navegación. Es obligatorio para usar cualquier tipo de navegación en React Navigation.
5. Otras Pantallas
Define las pantallas adicionales (ProductsScreen
y SettingsScreen
) según tu diseño:
// src/presentation/screens/products/ProductsScreen.tsx
import React from 'react';
import { View, Text } from 'react-native';
export const ProductsScreen = () => {
return (
<View>
<Text>Pantalla de Productos</Text>
</View>
);
};
// src/presentation/screens/settings/SettingsScreen.tsx
import React from 'react';
import { View, Text } from 'react-native';
export const SettingsScreen = () => {
return (
<View>
<Text>Pantalla de Configuración</Text>
</View>
);
};
Resultado
Cuando ejecutes tu aplicación, deberías:
- Ver la pantalla Home con dos botones: “Productos” y “Settings”.
- Al presionar un botón, navegarás a la pantalla correspondiente.
- Podrás regresar a la pantalla anterior gracias al encabezado de navegación predeterminado.
Conclusión
Este ejemplo demuestra cómo usar Stack Navigation en React Native para crear una navegación básica pero efectiva. Usar componentes reutilizables como PrimaryButton
mejora la legibilidad y mantenimiento del código. Además, configurar correctamente las rutas y opciones de pantalla asegura una experiencia de usuario fluida y personalizable.