反应导航-未定义不是对象(评估“ this.navigation.navigate”)

时间:2020-01-13 10:18:37

标签: react-native react-native-navigation

我正在按照本教程来实现用于用户身份验证的切换导航器:https://snack.expo.io/@react-navigation/auth-flow-v3

但是,当我尝试导航到下一个屏幕时,this.navigation.navigate似乎未定义。

undefined is not an object (evaluating 'this.props.navigation.navigate')

我正在为我的应用程序使用expo,并且已经查看了在React Native - navigation issue "undefined is not an object (this.props.navigation.navigate)"上类似问题上发布的解决方案,但无济于事。

import * as React from 'react';
import { createBottomTabNavigator } from 'react-navigation-tabs';

import profile from './app/screens/profile.js'
import home from './app/screens/home.js'
import createCompetition from './app/screens/create.js'
import explore from './app/screens/explore.js'
import Icon from 'react-native-vector-icons/MaterialIcons'
import login from './app/screens/login.js';
import { f } from './config/config.js';
import { ActivityIndicator, AsyncStorage, Button, StatusBar, StyleSheet, View } from 'react-native';
import { createStackNavigator } from 'react-navigation-stack';
import { createAppContainer, createSwitchNavigator } from 'react-navigation';
/** 
 * Tab Stack is the Bottom Navigator for the different pages
*/
const TabStack = createBottomTabNavigator(
  {
    Home: {
      screen: home,
      navigationOptions: {
        tabBarIcon: ({ tintColor }) => (
          <Icon name="home" size={25} style={{ color: tintColor }} />
        ),

      },
    },
    Explore: {
      screen: explore,
      navigationOptions: {
        tabBarIcon: ({ tintColor }) => (
          <Icon name="search" size={25} style={{ color: tintColor }} />
        ),

      }
    },
    Profile: {
      screen: profile,
      navigationOptions: {
        tabBarIcon: ({ tintColor }) => (
          <Icon name="person" size={25} style={{ color: tintColor }} />
        ),

      }
    },
    Create: {
      screen: createCompetition,
      navigationOptions: {
        tabBarIcon: ({ tintColor }) => (
          <Icon name="add" size={25} style={{ color: tintColor }} />
        ),

      }
    },
  },
  {
    tabBarOptions: {
      showIcon: true,
      showLabel: false,
      activeTintColor: 'black',

      style: { backgroundColor: 'white', }
    },

  },
)

/**
 * Loading Screen during authorization process
 */
class AuthLoadingScreen extends React.Component {
  constructor() {
    super();
    this._bootstrapAsync();
  }

  // Fetch the token from storage then navigate to our appropriate place
  _bootstrapAsync = async () => {
    f.auth().onAuthStateChanged(function (user) { //checks if user is signed in or out
      this.props.navigation.navigate(user ? 'App' : 'Auth');
    })
  };

  // Render any loading content that you like here
  render() {
    return (
      <View style={styles.container}>
        <ActivityIndicator />
        <StatusBar barStyle="default" />
      </View>
    );
  }
}
const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: 'center',
    justifyContent: 'center',
  },
});

const AppStack = createStackNavigator({ Home: TabStack });
const AuthStack = createStackNavigator({ Login: login });
const RootStack = createSwitchNavigator(
  {
    AuthLoading: AuthLoadingScreen,
    App: AppStack,
    Auth: AuthStack,
  },
  {
    initialRouteName: 'AuthLoading',
  }
);

const App = createAppContainer(RootStack);
export default App;

2 个答案:

答案 0 :(得分:1)

您不授予this函数和_bootstrapAsync回调访问onAuthStateChanged的权限。只需使用箭头函数将回调函数传递给它,因为它将当前函数自动绑定到当前应用this

_bootstrapAsync = async () => {
   f.auth().onAuthStateChanged((user) => { //checks if user is signed in or out
   this.props.navigation.navigate(user ? 'App' : 'Auth');
   })
};

答案 1 :(得分:0)

问题出在功能关键字上,该关键字未绑定this关键字。最好用ES6箭头函数代替它,这将其隐式绑定到内部范围:

f.auth().onAuthStateChanged((user) => { //checks if user is signed in or out
   this.props.navigation.navigate(user ? 'App' : 'Auth');
   })

希望它有助于消除疑惑。