No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Stacks de navegación

14/16
Recursos

Aportes 24

Preguntas 6

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

He aquí la importancia de saber Inglés y tener comprehensión; la documentación dice que la versión 5 para atrás ya no es mantenida. Lo que da cabida a muchos errores de compatibilidad.
Para evitar horas de debuggeo yo simplemente usé la versión recomendada por la misma documentación y todo funciona correctamente.

Antes de que continues esta clase. Instala la versión 6.x de React Navigation. Ahorrate dolores de cabeza.

Para los que están en la versión 6 de react-navigation, así quedaría el componente NavigationStack.js

import { createNativeStackNavigator } from "@react-navigation/native-stack";
import HomeScreen from "../screens/HomeScreen";
import Settings from "../screens/SettingsScreen";

const Stack = createNativeStackNavigator();

export default function NavigationStack() {
  return (
    <Stack.Navigator>
      <Stack.Screen name="Home" component={HomeScreen} />
      <Stack.Screen name="Settings" component={Settings} />
    </Stack.Navigator>
  );
}

Les recomiendo fuertemente seguir la documentación. El curso necesita una actualización en esta parte.

Yo agregaría para ir a una pantalla anterior como

navigation.goBack();

Me parece mejorcito extraer enseguida el props así, en vez de colocar (props)

export default function HomeScreen({navigation}) {

    const { navigate } = navigation;

    const goToSettings = () => {
        navigate("Settings")
    }
  • Shortcut para crear un componente rápidamente:
rnf 

Para los que hayan tenido el problema con @babel/plugin-proposal-export-namespace-from
Tuve que parar obviamente el server, ingresar el comando:
yarn add react-native-reanimated

Luego ir al babel.config.js y colorar sobre el final:
module.exports = {
presets: [‘module:metro-react-native-babel-preset’],
plugins: [
‘react-native-reanimated/plugin’,
],
};

Por último el comando yarn cache clean (muy importante) e iniciar el server normlamente.
Espero que les sirva!

Lee la documentación!

Cuando les muestre error de importación de CreateStackNavigator

Para los que ven el curso en el 2024, les recomiendo leer toda la documentación. *usa el siguiente código en el archivo: NavigationStack*.js ```js import { createNativeStackNavigator } from "@react-navigation/native-stack"; import HomeScreen from "../screens/HomeScreen"; import Settings from "../screens/SettingsScreen"; const Stack = createNativeStackNavigator(); export default function NavigationStack() { return ( <Stack.Navigator> <Stack.Screen name="HomeScreen" component={HomeScreen}></Stack.Screen> <Stack.Screen name="Settings" component={Settings}></Stack.Screen> </Stack.Navigator> ); } ``` Usa el siguiente código en el archivo: *HomeScreen*.js ```js import * as React from "react"; import { Text, View, Button } from "react-native"; export default function HomeScreen({ navigation }) { return ( <View style={{ flex: 1, alignItems: "center", justifyContent: "center" }}> <Button title="Go to Profile" onPress={() => navigation.navigate("Profile")} /> </View> ); } ``` Usa el siguiente código para el archivo: SettingsScreen.js ```js import * as React from "react"; import { Text, View, Button } from "react-native"; export default function SettingsScreen({ navigation }) { return ( <View style={{ flex: 1, alignItems: "center", justifyContent: "center" }}> <Button title="Go back" onPress={() => navigation.goBack()} /> </View> ); } ```

Para seguirle el ritmo pongan el video en 0.85x por que va a mil por hora 😂

Para hacer un código más elegante y ahorrar líneas pueden realizar la desestructuración de la siguiente manera

export default function SettingsScreen( { navigation } ) {}

😎 Les dejo mis notas de esta clase Notion

para los que lo hagan con la version 5 y no les funcione por un error tiene que agregar esta linea en el archivo de babel

plugins: [‘react-native-reanimated/plugin’],

saludos

Algunos comandos útiles durante el debugueo (algunos proporcionados por chatgpt) //Borrar Grandlew eliminar node modules y seguir la documentacion cd android gradlew clean //Matar el proceso en el puerto 8081 npx kill-port 8081 //Cambiar de puerto el proceso en el puerto 8081 npx react-native start --port 8088 //Deshabilitar la extensión de Java //seguir la documentacion npx react-native start npx react-native run-android Cuando se instala o se agrega el navegador y/o stack navigator import android.os.Bundle; yarn cache clean yarn install
Es como react-router-dom básicamente
31 de marzo 2024: Mi NavigationStack.js quedo asi: ```js import {createNativeStackNavigator} from "@react-navigation/native-stack"; import HomeScreen from "../screens/HomeScreen"; import HelloScreen from "../screens/HelloScreen"; const Stack = createNativeStackNavigator(); export default function NavigationStack() { return ( <Stack.Navigator> <Stack.Screen name="Home" component={HomeScreen}/> <Stack.Screen name="Hello" component={HelloScreen}/> </Stack.Navigator> ); } ```import {createNativeStackNavigator} from "@react-navigation/native-stack"; import HomeScreen from "../screens/HomeScreen"; import HelloScreen from "../screens/HelloScreen"; const Stack = createNativeStackNavigator(); export default function NavigationStack() { return ( \<Stack.Navigator> \<Stack.Screen name="Home" component={HomeScreen}/> \<Stack.Screen name="Hello" component={HelloScreen}/> \</Stack.Navigator> ); }
31 de marzo de 2024: Despues de instalar la version de node 18 y crear la aplicacion con yarn: Instalar la navegacion: yarn add @react-navigation/native yarn add @react-navigation/native-stack yarn add react-native-screens react-native-safe-area-context Mi componente Navigation quedo asi: ```js import {createNativeStackNavigator} from "@react-navigation/native-stack"; import HomeScreen from "../screens/HomeScreen"; import HelloScreen from "../screens/HelloScreen"; const Stack = createNativeStackNavigator(); export default function NavigationStack() { return ( <Stack.Navigator> <Stack.Screen name="Home" component={HomeScreen}/> <Stack.Screen name="Hello" component={HelloScreen}/> </Stack.Navigator> ); } ```import {createNativeStackNavigator} from "@react-navigation/native-stack";import HomeScreen from "../screens/HomeScreen";import HelloScreen from "../screens/HelloScreen"; const Stack = createNativeStackNavigator(); export default function NavigationStack() { return ( \<Stack.Navigator> \<Stack.Screen name="Home" component={HomeScreen}/> \<Stack.Screen name="Hello" component={HelloScreen}/> \</Stack.Navigator> );}
Si estan usando react-native en vez de expo y les sale alguno de los siguientes errores: \- Invariant Violation: TurboModuleRegistry.getEnforcing(...): 'RNGestureHandlerModule' could not be found. -Invariant Violation: "NameProject" has not been registered. This can happen if:Metro (the local dev server) is run from the wrong folder. Check if Metro is running, stop it and restart it in the current project.A module failed to load due to an error and `AppRegistry.registerComponent` wasn't called., js Intenten hacer cd ios pod install cd ..
actualemente toca usar rnc

Ahora createStackNavigator() combió por esto:

import { createNativeStackNavigator } from '@react-navigation/native-stack';

Mirenlo aquí

Para los que vamos en el año 2023, con RN CLI y typescript, pueden utilizar useNavigation para provocar la navegación, de lo contrario están completamente ligados a enviarlo por props y en typescript es mas complicado el manejo de las mismas.

const navigation = useNavigation<ProfileScreenNavigationProp>();

TIPADO CON TYPESCRIPT
Si están usando typescript y quieren tipar los props:
Crean un archivo llamado types.d.ts dentro de la carpeta navigation y colocan:

import type { CompositeScreenProps, NavigatorScreenParams} from '@react-navigation/native';
import type { StackScreenProps } from '@react-navigation/stack';
import type { BottomTabScreenProps } from '@react-navigation/bottom-tabs';
  
export type RootStackParamList = {
    Home: NavigatorScreenParams<HomeTabParamList>;
    Settings: undefined;
};
  
export type RootStackScreenProps<T extends keyof RootStackParamList> = StackScreenProps<RootStackParamList, T>;

  
declare global {
    namespace ReactNavigation {
        interface RootParamList extends RootStackParamList {}
    }
}

Ese código lo obtuve de la documentación pero lo adapté al ejemplo del profesor.
Y ahora dentro de HomeScreen.ts

import { View, Text, Button } from "react-native";
import type { StackScreenProps } from "@react-navigation/stack";
import { RootStackParamList } from "../navigation/types";


export function HomeScreen({navigation}: StackScreenProps<RootStackParamList, "Home">): JSX.Element {
    const goToSettings = () => {
        navigation.navigate("Home");
    }

    return (
        <View>
            <Text>This is homeScreen</Text>
            <Text>This is homeScreen</Text>
            <Text>This is homeScreen</Text>
            <Text>This is homeScreen</Text>
            <Button onPress={goToSettings} title="Go to settings"/>
        </View>   
    )
}

Excelente curso!! 😎