React Native导航:undefined不是对象

时间:2017-07-24 19:39:32

标签: react-native react-native-android react-navigation

我尝试根据this教程使用反应导航在React Native中实现导航,但在启动应用时遇到以下错误:

undefined不是对象(评估' this.props.navigation.navigate') render index.android.js:17:12

我的index.android.js:

import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View,
  Button
} from 'react-native';
import {
  StackNavigator,
} from 'react-navigation';



export default class Abc extends Component {
  render() {
    const { navigate } = this.props.navigation;
    return (
      <View style={styles.container}>
        <Text style={styles.welcome}>
          Welcome to React Native!
        </Text>
        <Button
        title="Go to List"
        onPress={() =>
          navigate('Liste')
        }
      />
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  welcome: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
  },
  instructions: {
    textAlign: 'center',
    color: '#333333',
    marginBottom: 5,
  },
});
export class HomeScreen extends React.Component {
  static navigationOptions = {
    title: 'Welcome',
  };
  render() {
    const { navigate } = this.props.navigation;
    return (
      <Button
        title="Go to List"
        onPress={() =>
          navigate('Profile')
        }
      />
    );
  }
}
export class Liste extends React.Component {
  static navigationOptions = {
    title: 'Liste',
  };
  render() {
    const { navigate } = this.props.navigation;
    return (
      <Button
        title="Liste"
      />
    );
  }
}
const App = StackNavigator({
  Home: { screen: HomeScreen },
  Liste: { screen: Liste },
});
AppRegistry.registerComponent('Abc', () => Abc);

你有什么建议吗?谢谢!

3 个答案:

答案 0 :(得分:2)

我相信您要做的是在App而不是AppRegistry组件中注册Abc组件。

您遇到此undefined is not an object (Evaluating 'this.props.navigation.navigate')的原因是props.navigation组件中没有Abc。如果仔细查看代码的底部, 你有:

const App = StackNavigator({
  Home: { screen: HomeScreen },
  Liste: { screen: Liste },
});

AppRegistry.registerComponent('Abc', () => Abc);

所以你已经创建了一个StackNavigator组件,但是你没有注册这个组件,而是在AbcAppRegistry组件中注册了Abc组件。不是StackNavigator下的任何屏幕,它无法访问this.props.navigation,因此您会遇到异常。

答案 1 :(得分:1)

您没有Profile屏幕 如果您想从Liste转到HomeScreen屏幕,请使用:

onPress={() => navigate('Liste')}

如果您想转到Profile屏幕,则需要Profile Screen并将其添加到StackNavigator,例如:

export class Profile extends React.Component {
    static navigationOptions = {
        title: 'Profile',
    };
    render() {
        const { navigate } = this.props.navigation;
        return (
            <Button
                title="Profile"
            />
        );
    }
}
const App = StackNavigator({
    Home: { screen: HomeScreen },
    Liste: { screen: Liste },
    Profile: {screen: Profile},
});

答案 2 :(得分:0)

提出原始问题以来已经快3年了。我遇到了同样的问题,并落入了此页面。

反应导航现在是v5。我遇到的问题是因为“导航”没有传递给子组件。

经过更多研究,我从此处使用此解决方案解决了问题。

我需要像这样将道具传递给子组件。

<GoToButton navigation={props.navigation} />

https://reactnavigation.org/docs/connecting-navigation-prop

希望这对像我这样的新手有帮助。