【问题标题】:How to solve "Invariant Violation: The navigation prop is missing for this navigator"?如何解决“不变违规:此导航器缺少导航道具”?
【发布时间】:2019-08-27 00:06:24
【问题描述】:

我刚刚将我的 react-navigation 版本从 1..0.0-beta.11 更新到最新的 react-navigation 版本 3。现在,在我的项目中,我在 HomeScreen.js 中使用了 createStackNavigator。这是代码-

HomeScreen.js

import React from 'react';
import { StyleSheet, Text, View, AsyncStorage } from 'react-native';
import {
  createStackNavigator
} from "react-navigation";
import WelcomeScreen from './WelcomeScreen';
import LoginScreen from './components/LoginScreen';
import NoteMeHome from './components/NoteMeHome';
import HomeDrawer from './HomeDrawer/HomeDrawer';
import SettingsScreen from './components/SettingsScreen';

class HomeScreen extends React.Component {

  state = {
    getValue: null,
  }

  async componentDidMount() {
    const token = await AsyncStorage.getItem('token');
    this.setState({ getValue: token });

  }

  render() {
    console.log('#ZZZ:', this.state.getValue);

    if(this.state.getValue !== null) {
      return (
        <AppStackNavigator/>
      );
    } else {
      return (
        <AppStackNavigator2/>
      );
    }

  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
});

const AppStackNavigator = createStackNavigator({
  LoginScreen: {screen:LoginScreen},
  HomeDrawer: {screen:HomeDrawer},
  WelcomeScreen: {screen:WelcomeScreen},
  NoteMeHome: {screen:NoteMeHome},
  SettingsScreen: {screen:SettingsScreen}

}, 

{
  initialRouteName: 'WelcomeScreen'

}

)

const AppStackNavigator2 = createStackNavigator({
  WelcomeScreen: {screen:WelcomeScreen},
  HomeDrawer: {screen:HomeDrawer
  },

  LoginScreen: {screen:LoginScreen},
  NoteMeHome: {screen:NoteMeHome},

  SettingsScreen: {screen:SettingsScreen}

},  
{
  initialRouteName: 'WelcomeScreen'

}

)
export default HomeScreen;

在进行此更新之前,我的代码运行良好。但是更新后显示以下错误-

这是 package.json 文件-

{
  "main": "node_modules/expo/AppEntry.js",
  "scripts": {
    "start": "expo start",
    "android": "expo start --android",
    "ios": "expo start --ios",
    "eject": "expo eject"
  },
  "dependencies": {
    "expo": "^32.0.0",
    "native-base": "^2.12.1",
    "react": "16.5.0",
    "react-native": "https://github.com/expo/react-native/archive/sdk-32.0.0.tar.gz",
    "react-native-awesome-alerts": "^1.2.0",
    "react-native-cardview": "^2.0.2",
    "react-navigation": "^3.6.1"
  },
  "devDependencies": {
    "babel-preset-expo": "^5.0.0"
  },
  "private": true
}

所以,如果有人能帮我解决这个问题,那就太好了

【问题讨论】:

标签: javascript react-native react-navigation


【解决方案1】:

只需在您的问题中添加此代码即可。您必须将堆栈包装在 createAppContainer 中。

import { createAppContainer } from 'react-navigation'



const AppStackNavigator = createAppContainer(createStackNavigator({
  LoginScreen: {screen:LoginScreen},
  HomeDrawer: {screen:HomeDrawer},
  WelcomeScreen: {screen:WelcomeScreen},
  NoteMeHome: {screen:NoteMeHome},
  SettingsScreen: {screen:SettingsScreen}

}, 
{
  initialRouteName: 'WelcomeScreen'

}
))


const AppStackNavigator2 = createAppContainer(createStackNavigator({
  WelcomeScreen: {screen:WelcomeScreen},
  HomeDrawer: {screen:HomeDrawer
  },

  LoginScreen: {screen:LoginScreen},
  NoteMeHome: {screen:NoteMeHome},

  SettingsScreen: {screen:SettingsScreen}

},  
{
  initialRouteName: 'WelcomeScreen'

}
))

【讨论】:

  • 添加后,显示以下错误-每个模块只允许一个默认导出。
  • @S. M. Asif 我已经更新了我的答案。试试这个吧。
  • @S.M.Asif 在 react-navigation 3.0 中,您必须将容器包装在 AppContainer 中
【解决方案2】:

在 react-navigation v3 中,您必须用 createAppContainer 包裹 makeRootNavigator

将您的代码更改为:

render() {
   const Navigator = createAppContainer(makeRootNavigator(this.state.accessToken));
   return <Navigator />
}

别忘了在文件顶部导入createAppContainer

import {createSwitchNavigator, createAppContainer} from 'react-navigation'

【讨论】:

    【解决方案3】:

    在 react-navigation v4 中,使用createAppContainer 包装的结构仍然存在,但您必须从react-navigation 导入createAppContainer 和从react-navigation-stack 导入createStackNavigator

    例如

    import {createAppContainer} from 'react-navigation';
    import {createStackNavigator} from 'react-navigation-stack';
    import HomeScreen from './HomeScreen';
    import AnotherScreen from './AnotherScreen';
    
    export default createAppContainer(
      createStackNavigator(
        {
          Home: HomeScreen,
          Another: AnotherScreen,
        },
        {
          initialRouteName: 'Home',
        },
      ),
    );
    

    【讨论】:

      猜你喜欢
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 2019-04-22
      • 2020-05-29
      • 2019-12-08
      • 2019-09-11
      • 1970-01-01
      • 2021-08-29
      相关资源
      最近更新 更多