不变违规:此导航器缺少导航道具


120

当我尝试启动我的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 />;
  }
}

它说您缺少应用程序容器
Demon

因此,基本上我必须将所有内容都放在App容器内的Stack Navigator中?我感到困惑的是,这种设置可以与我以前的项目一起正常工作。
Glenn Parale

Answers:


183

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;

7
超级困惑的@Turnipdabeets可以为您提供更全面的代码示例(我是React Native的新手)。
汤姆·迪克森

谢谢你帮我!:)
蓝色电车

2
@Turnipdabeets我使用了此解决方案,但出现一个错误“ createStackNavigator()已移至react-navigation-stack。有关更多详细信息,请参见reactnavigation.org/docs/4.x/stack-navigator.html ”。你能帮我吗
kb920


这也对我有用。因此,基本上,您必须将所有内容放入App容器中。
Lahiru Amarathunge

26

@汤姆·迪克森是这样的:

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 />

10

创建一个新文件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 />
    );
  }
}

6

这是另一种方式

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);

3
const AppNavigator = createStackNavigator({
  Home: { screen: Home },
  Friends: { screen: Friends },
});

我做的很简单

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

代替

export default AppNavigator;

2

import React, { Component } from 'react';
import { createStackNavigator, createAppContainer } from 'react-navigation';
import Home from './home';
import Details from './details';

const Root = createStackNavigator({

    home: { 

        screen: Home,
    },

    details: { 

        screen: Details,
    },

});

const container = createAppContainer(Root);
export default container;   

在您的App.js文件中使用 </container>


2

我在底部有代码

export default class App extends React.Component {
  render() {
    return (
      <View >
        <SimpleApp style={{ width: Dimensions.get("window").width }} />
      </View>
    );
  }
}

我只是将其替换为,它就像一个魅力。肯定是因为react-navigation库中的更新:

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

另外,我还在顶部的react-navigation中包括了createAppContainer库。


2

这是要创建一个具有两个选项卡的底部导航器:

import {createBottomTabNavigator, createAppContainer} from 'react-navigation';

export class Home extends Component{
   //...
}

export class Settings extends Component{
   //...
}     

const navig = createBottomTabNavigator({
  Home: Home,
  Settings: Settings
});

const App = createAppContainer(navig);

export default App;

0

在许多Google搜索之后,我浪费了2.5个小时才得到了这个解决方案...希望这可以工作。

只需导入这两个:

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

然后对您的代码进行如下更改:

在类上方创建const

const AppNavigator = createAppContainer(RootStack);

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

<AppNavigator />

谢谢!


-2

我过去几天一直在挣扎。可能您是否也在努力解决是否从package.json中删除了react-navigation并使用npm安装了它,请检查您的备份项目并查看导航版本并尝试添加相同并删除节点模块,然后进行npm安装。希望它的作品。

祝你好运,用React-Native打破你的头:-)


欢迎来到SO。这看起来并不像答案。
Mike Poole

Android的创始人!
Sumit Shukla
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.