You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native登录页跳转报错:undefined is not an object (evaluating 'navigation.navigate')

问题描述

我已经在应用中嵌入底部导航标签栏,首页位于第一个标签页。希望点击登录页的登录按钮后,跳转到包含首页的主视图(MainContainer),但点击绑定了onPress={goToHome}的登录按钮时出现以下错误:

TypeError: undefined is not an object (evaluating 'navigation.navigate')

登录页代码如下:

import {
  View,
  Text,
  Button,
  TextInput,
  StyleSheet,
  Image,
  TouchableOpacity
} from 'react-native'
import React from 'react'
import { styleProps } from 'react-native-web/dist/cjs/modules/forwardedProps';
import { color } from 'react-native-reanimated';
import MainContainer from '../MainContainer';

export default function LoginScreen({ navigation }) {
  const goToHome = () => {
    navigation.navigate('MainContainer')
  }
  const [text, onChangeText] = React.useState("ExD-");
  const [password, onChangePassword] = React.useState();

  return (
    <View style={styles.container}>
      <Image
        source={require('../../assets/Logo/logo.png')}
        style={{ width: 150, height: 150, paddingTop: 60 }}
      />
      <Text style={styles.loginText}>Login</Text>
      <TextInput
        style={styles.input}
        onChangeText={onChangeText}
        value={text}
      />
      <TextInput
        style={styles.inputPassword}
        onChangeText={onChangePassword}
        value={password}
        secureTextEntry={true}
      />

      <Button title='Login' onPress={goToHome} />

      <View style={styles.forgotPasswordView}>
        <TouchableOpacity underlayColor='#fff'>
          <Text style={styles.forgotPasswordText}>Forgot Password?</Text>
        </TouchableOpacity>
      </View>
    </View >
  )
}
解决方案

1. 确保LoginScreen处于导航器栈中

如果LoginScreen不是通过React Navigation的导航器(如StackNavigator)渲染的,navigation prop不会自动传递。检查导航配置,确保LoginScreen被注册在导航栈内,示例如下:

import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import LoginScreen from './screens/LoginScreen';
import MainContainer from './screens/MainContainer';

const Stack = createStackNavigator();

function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator initialRouteName="Login">
        <Stack.Screen name="Login" component={LoginScreen} />
        <Stack.Screen name="MainContainer" component={MainContainer} />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

export default App;

2. 使用useNavigation钩子替代props传递

如果因组件层级问题无法获取navigation prop,可使用React Navigation提供的useNavigation钩子修改代码:

import { useNavigation } from '@react-navigation/native'; // 导入钩子

export default function LoginScreen() {
  const navigation = useNavigation(); // 获取navigation对象
  const goToHome = () => {
    navigation.navigate('MainContainer')
  }
  // 其余代码保持不变
}

3. 确认MainContainer的导航注册名称

确保要跳转的MainContainer已在导航器中注册,且注册的screen名称与navigation.navigate中传入的字符串完全一致(区分大小写)。

4. 检查组件渲染方式

如果LoginScreen是作为普通组件直接渲染(未通过导航器的Screen组件),则无法获取导航上下文。必须通过导航器的路由渲染LoginScreen,才能拿到navigation相关属性。

内容的提问来源于stack exchange,提问作者amify

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 06:06:06