不变违规:此导航器缺少导航props

IT技术 reactjs react-native
2021-03-23 04:58:18

我在尝试启动 React Native 应用程序时收到此消息。通常这种格式适用于其他多屏幕导航,但不知何故在这种情况下不起作用。

这是错误:

Invariant Violation: The navigation prop is missing for this navigator. In 
react-navigation 3 you must set up your app container directly. More info: 
https://reactnavigation.org/docs/en/app-containers.html

这是我的应用程序格式:

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

import Login from './view/login.js'
import SignUp from './view/signup.js'

const RootStack = createStackNavigator(
  {
    Home: {
      screen: Login
    },
    Signup: {
      screen: SignUp
    }
  },
  {
    initialRouteName: 'Home'
  }

);

export default class App extends React.Component {
  render() {
    return <RootStack />;
  }
}
6个回答

React Navigation 3.0 有许多重大更改,包括根导航器所需的显式应用程序容器。

过去,任何导航器都可以充当应用程序顶层的导航容器,因为它们都封装在“导航容器”中。导航容器,现在称为应用程序容器,是一个高阶组件,它维护应用程序的导航状态并处理与外部世界的交互以将链接事件转换为导航操作等。

在 v2 及更早版本中,React Navigation 中的容器由 create*Navigator 函数自动提供。从 v3 开始,您需要直接使用容器。在 v3 中,我们还将 createNavigationContainer 重命名为 createAppContainer。

另请注意,如果您现在使用的是 v4,导航器已移至单独的存储库。您现在需要安装并从'react-navigation-stack'. 例如import { createStackNavigator } from 'react-navigation-stack'下面的解决方案适用于 v3。

import {
  createStackNavigator,
  createAppContainer
} from 'react-navigation';
const MainNavigator = createStackNavigator({...});
const App = createAppContainer(MainNavigator);

一个更全面的代码示例:

import {
      createStackNavigator,
      createAppContainer
    } from 'react-navigation';
import Login from './view/login.js'
import SignUp from './view/signup.js'

const RootStack = createStackNavigator({
    Home: {
      screen: Login
    },
    Signup: {
      screen: SignUp
    }
  });

const App = createAppContainer(RootStack);

export default App;
超级困惑的@Turnipdabeets 你能否提供一个更全面的代码示例(我是 React Native 的新手)。
2021-05-26 04:58:18
2021-05-26 04:58:18
那我怎么能把它包装在商店里呢?
2021-06-01 04:58:18
这也适用于我。所以基本上你必须把所有东西都放在一个应用程序容器中。
2021-06-17 04:58:18
@Turnipdabeets 我使用了此解决方案,但出现错误“createStackNavigator()已移至react-navigation-stack。有关更多详细信息,请参阅reactnavigation.org/docs/4.x/stack-navigator.html。” 你能帮我一下吗。
2021-06-19 04:58:18

@Tom Dickson 是这样的:

import React, { Component } from 'react';
import { createStackNavigator, createAppContainer } from 'react-navigation';

import ScreenOne from './ScreenOne';
import ScreenTwo from './ScreenTwo';

const NavStack = createStackNavigator({
    ScreenOne: { 
        screen: ScreenOne,
    },
    ScreenTwo: { 
        screen: ScreenTwo,
    },
});

const App = createAppContainer(NavStack);

export default App;

然后引用它

<App />

创建一个新文件 ScreenContainer.js(您可以选择名称)。然后在 ScreenContainer 文件中添加:

import React, { Component } from 'react';
import { createStackNavigator, createAppContainer } from 'react-navigation';
import MainScreen from './MainScreen'; 
import AboutScreen from './AboutScreen';

const NavigationStack = createStackNavigator({
    Main: { 
        screen: MainScreen,
    },
    About: { 
        screen: AboutScreen,
    },
});

const Container = createAppContainer(NavigationStack);

export default Container; 

然后在你的 App.js 文件中:

import Container from './ScreenContainer';

class App extends Component {
  render() {
    return (
      <Container />
    );
  }
}

这是另一种方式

import React, {Component} from 'react';
import { StyleSheet, Text, View } from 'react-native';
import { createStackNavigator,createAppContainer } from 'react-navigation';

import Login from './view/login.js'
import SignUp from './view/signup.js'

const RootStack = createStackNavigator(
  {
    Home: {
      screen: Login
    },
    Signup: {
      screen: SignUp
    }
  },
  {
    initialRouteName: 'Home'
  }

);

class App extends React.Component {
  render() {
    return <RootStack />;
  }
}

export default createAppContainer(RootStack);

经过多次谷歌搜索后,我浪费了 2.5 个小时来获得这个解决方案......希望这会奏效。

只需导入这两个:

import { createStackNavigator } from "react-navigation-stack";
import { createAppContainer } from "react-navigation";

并对您的代码进行一些更改,如下所示:

在类上方创建 const

const AppNavigator = createAppContainer(RootStack);

最后在类中调用 const 而不是 <RootStack/>

<AppNavigator />

谢谢!

这是因为createStackNavigator()已移至react-navigation-stack. 有关更多详细信息,请参阅reactnavigation.org/docs/stack-navigator.html
2021-05-29 04:58:18