【问题标题】:TypeError: undefined is not an object (evaluating 'navigation.navigate') React NativeTypeError: undefined is not an object (evalating 'navigation.navigate') React Native
【发布时间】:2021-08-24 12:39:28
【问题描述】:

当我按下按钮时,我需要导航到主屏幕。 但我得到一个错误=> TypeError: undefined is not an object (evaluating 'navigation.navigate')

我的代码

import React, { Component, useEffect  } from 'react'    
import { Card } from 'react-native-elements'         
import AsyncStorage from '@react-native-async-storage/async-storage';
import screenStyles from './ScreenStyles';
import HomeHeader from '../components/HomeHeader';
import TicketCardList from '../components/TicketCardList';
import DisableModal from '../components/disableModal';
import { Camera } from 'expo-camera';
import * as Permissions from 'expo-permissions';
import {API_URL, API_TOKEN, API_URL2} from "@env"
import ClearLocalStorage from '../config/clearLocalStorage';

export default class CreateTroubleT extends Component {

    constructor(){
        super();
    }

    
    cancelButtonPress =() => {
        this.props.navigation.navigate('HomeBottomBar');
        console.log("OK")
    }


    render() {

        return (                            
                            
                        <TouchableOpacity style={styles.cancelJBDesing} onPress={()=> this.cancelButtonPress()}>
                        </TouchableOpacity>  
        )
    }
}

当我按下取消按钮时,我得到了错误。我是 Native 新手,非常感谢任何建议

【问题讨论】:

    标签: javascript react-native react-navigation


    【解决方案1】:

    问题是因为当你按下按钮时,你说你要调用cancelButtonPress,没有参数,如下所示

    onPress={()=> this.cancelButtonPress()}
    

    但是当你定义cancelButtonPress时,它是一个需要如下所示参数的函数

    cancelButtonPress (navigation) {
        navigation.navigate('HomeBottomBar')
        console.log("OK")
    }
    

    自从你在没有传递参数的情况下调用cancelButtonPress 时,navigation 就是undefined,这就是navigation.navigate 向你抛出这个错误的原因。

    解决方案

    实际上你不应该在按下cancelButtonPress 时传递参数,因为navigation 不是你应该通过函数调用传递的东西。相反,您应该更新您的cancelButtonPress 函数,如下所示

    cancelButtonPress = () => {
      this.props.navigation.navigate('HomeBottomBar');
      console.log("ok");
    }
    

    假设您已正确设置react-navigation,则应该可以通过this.props.navigation 访问它

    【讨论】:

    • 你能告诉我如何设置 react-navigation
    • 还有很多工作要做,如果您尝试了我的解决方案但它不起作用,那么您的反应导航可能没有正确设置,这绝对值得另一个问题拥有
    • @RyanFonseka:更新代码后,您遇到的错误是什么?
    • console.log 正在工作,但 this.props.navigation.navigate('HomeBottomBar');
    • 是的,这意味着就像我所说的那样,您没有正确设置您的react-navigation,这本身就是一个单独的问题。在这个新问题中,您可以做的是分享您设置的与react-navigation 相关的所有代码,希望有人能帮助您
    【解决方案2】:

    您似乎没有为函数提供任何参数(因此导航的值确实是undefined)。为什么不向cancelButtonPress 函数提供事件e 并尝试console.log navigation 的值?

    你最终会得到类似的东西:

    &lt;TouchableOpacity style={styles.cancelJBDesing} onPress={e=&gt; this.cancelButtonPress(e)}&gt; (当涉及到你的 JSX)。

    cancelButtonPress (navigation) {
        console.log(navigation);
        navigation.navigate('HomeBottomBar');
        console.log("OK");
    }
    

    (当涉及到功能时)。

    这样的事情将允许您拥有一个与undefined 不同的navigation 对象。

    如果你不想让自己过于复杂,你应该重构你的cancelButtonPress,以便它正确实现navigation.navigate

    你会得到这样的结果:

    cancelButtonPress () {
       console.log("OK");
       this.props.navigation.navigate("/pathToHome");
    }
    

    在这种情况下,您不需要捕获 e 事件,因为您实际上不需要向函数提供任何参数来获得预期的行为。

    【讨论】:

    • OP 正在开发一个 React Native 项目,所以图中没有 browserHistoryevent,因为它不是 Web 项目
    • onPress={e=&gt; this.cancelButtonPress(e)}&gt;错了,TouchableOpacity中没有这样的e