Good evening to y’all!!
I’m trying to click my “login or register button” but I’m receiving the following error: “TypeError: Cannot read property ‘navigate’ of undefined”
I tried to do small changes within the project but no joy 🙁
TypeError: Cannot read property 'navigate' of undefined onPress C:/Users/André Vieira/DoneWithit/app/screens/WelcomeScreen.js:21 18 | <View style={styles.buttonsContainer}> 19 | <Button 20 | title="Login" > 21 | onPress={() => navigation.navigate(routes.LOGIN)} | ^ 22 | /> 23 | <Button 24 | title="Register" View compiled
This is my login screen
import React, { useState } from "react"; import { StyleSheet, Image } from "react-native"; import * as Yup from "yup"; import Screen from "../components/Screen"; import { ErrorMessage, Form, FormField, SubmitButton, } from "../components/forms"; import authApi from "../api/auth"; import useAuth from "../auth/useAuth"; const validationSchema = Yup.object().shape({ email: Yup.string().required().email().label("Email"), password: Yup.string().required().min(4).label("Password"), }); function LoginScreen(props) { const auth = useAuth(); const [loginFailed, setLoginFailed] = useState(false); const handleSubmit = async ({ email, password }) => { const result = await authApi.login(email, password); if (!result.ok) return setLoginFailed(true); setLoginFailed(false); auth.logIn(result.data); }; return ( <Screen style={styles.container}> <Image style={styles.logo} source={require("../assets/logo-red.png")} /> <Form initialValues={{ email: "", password: "" }} onSubmit={handleSubmit} validationSchema={validationSchema} > <ErrorMessage error="Invalid email and/or password." visible={loginFailed} /> <FormField autoCapitalize="none" autoCorrect={false} icon="email" keyboardType="email-address" name="email" placeholder="Email" textContentType="emailAddress" /> <FormField autoCapitalize="none" autoCorrect={false} icon="lock" name="password" placeholder="Password" secureTextEntry textContentType="password" /> <SubmitButton title="Login" /> </Form> </Screen> ); } const styles = StyleSheet.create({ container: { padding: 10, }, logo: { width: 80, height: 80, alignSelf: "center", marginTop: 50, marginBottom: 20, }, }); export default loginscreen;
Maybe it is something simple but I can’t figure it out.
Anyone, to help? Thank you
My Welcome Screen
import React from "react"; import { ImageBackground, StyleSheet, View, Image, Text } from "react-native"; import Button from "../components/Button"; import routes from "../navigation/routes"; function WelcomeScreen({ navigation }) { return ( <ImageBackground blurRadius={10} style={styles.background} source={require("../assets/background.jpg")} > <View style={styles.logoContainer}> <Image style={styles.logo} source={require("../assets/logo-red.png")} /> <Text style={styles.tagline}>Sell What You Don't Need</Text> </View> <View style={styles.buttonsContainer}> <Button title="Login" onPress={() => navigation.navigate(routes.LOGIN)} /> <Button title="Register" color="secondary" onPress={() => navigation.navigate(routes.REGISTER)} /> </View> </ImageBackground> ); } const styles = StyleSheet.create({ background: { flex: 1, justifyContent: "flex-end", alignItems: "center", }, buttonsContainer: { padding: 20, width: "100%", }, logo: { width: 100, height: 100, }, logoContainer: { position: "absolute", top: 70, alignItems: "center", }, tagline: { fontSize: 25, fontWeight: "600", paddingVertical: 20, }, }); export default WelcomeScreen;
From Console
Uncaught TypeError: Cannot read property 'navigate' of undefined at onPress (WelcomeScreen.js:21) at onClick (PressResponder.js:333) at HTMLUnknownElement.callCallback (react-dom.development.js:188) at Object.invokeGuardedCallbackDev (react-dom.development.js:237) at invokeGuardedCallback (react-dom.development.js:292) at invokeGuardedCallbackAndCatchFirstError (react-dom.development.js:306) at executeDispatch (react-dom.development.js:389) at executeDispatchesInOrder (react-dom.development.js:414) at executeDispatchesAndRelease (react-dom.development.js:3278) at executeDispatchesAndReleaseTopLevel (react-dom.development.js:3287) at forEachAccumulated (react-dom.development.js:3259) at runEventsInBatch (react-dom.development.js:3304) at runExtractedPluginEventsInBatch (react-dom.development.js:3514) at handleTopLevel (react-dom.development.js:3558) at batchedEventUpdates$1 (react-dom.development.js:21871) at batchedEventUpdates (react-dom.development.js:795) at dispatchEventForLegacyPluginEventSystem (react-dom.development.js:3568) at attemptToDispatchEvent (react-dom.development.js:4267) at dispatchEvent (react-dom.development.js:4189) at unstable_runWithPriority (scheduler.development.js:653) at runWithPriority$1 (react-dom.development.js:11039) at discreteUpdates$1 (react-dom.development.js:21887) at discreteUpdates (react-dom.development.js:806) at dispatchDiscreteEvent (react-dom.development.js:4168)
Advertisement
Answer
It seems like WelcomeScreen isn’t inside of the navigator the passes down navigation as props. If you’re using react-navigation 5.x you can use the hook:
import React from "react"; import { ImageBackground, StyleSheet, View, Image, Text } from "react-native"; import { useNavigation } from '@react-navigation/native'; import Button from "../components/Button"; import routes from "../navigation/routes"; function WelcomeScreen() { const navigation = useNavigation(); return ( <ImageBackground blurRadius={10} style={styles.background} source={require("../assets/background.jpg")} > <View style={styles.logoContainer}> <Image style={styles.logo} source={require("../assets/logo-red.png")} /> <Text style={styles.tagline}>Sell What You Don't Need</Text> </View> <View style={styles.buttonsContainer}> <Button title="Login" onPress={() => navigation.navigate(routes.LOGIN)} /> <Button title="Register" color="secondary" onPress={() => navigation.navigate(routes.REGISTER)} /> </View> </ImageBackground> ); } const styles = StyleSheet.create({ background: { flex: 1, justifyContent: "flex-end", alignItems: "center", }, buttonsContainer: { padding: 20, width: "100%", }, logo: { width: 100, height: 100, }, logoContainer: { position: "absolute", top: 70, alignItems: "center", }, tagline: { fontSize: 25, fontWeight: "600", paddingVertical: 20, }, }); export default WelcomeScreen;