Violación invariante: falta el accesorio de navegación para este navegador

120

Recibo este mensaje cuando intenté iniciar mi aplicación nativa de reacción. Por lo general, este tipo de formato funciona en otra navegación de múltiples pantallas, pero de alguna manera no funciona en este caso.

Aquí está el error:

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

Aquí está el formato de mi aplicación:

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 />;
  }
}
Glenn Parale
fuente
dice que le falta el contenedor de la aplicación
Demon
Entonces, básicamente, ¿tengo que poner todo en el Stack Navigator dentro de un contenedor de aplicaciones? Lo que me confunde es que este tipo de configuración ha funcionado con mis proyectos anteriores sin ningún defecto.
Glenn Parale

Respuestas:

183

React Navigation 3.0 tiene una serie de cambios importantes que incluyen un contenedor de aplicaciones explícito requerido para el navegador raíz.

En el pasado, cualquier navegador podía actuar como contenedor de navegación en el nivel superior de su aplicación porque todos estaban envueltos en "contenedores de navegación". El contenedor de navegación, ahora conocido como contenedor de aplicaciones, es un componente de orden superior que mantiene el estado de navegación de su aplicación y maneja la interacción con el mundo exterior para convertir los eventos de vinculación en acciones de navegación, etc.

En v2 y anteriores, los contenedores en React Navigation son proporcionados automáticamente por las funciones create * Navigator. A partir de la versión 3, debe utilizar el contenedor directamente. En v3 también cambiamos el nombre de createNavigationContainer a createAppContainer.

También tenga en cuenta que si ahora está usando v4, los navegadores se han movido a un repositorio separado. Ahora deberá instalar e importar desde 'react-navigation-stack'. Por ejemplo import { createStackNavigator } from 'react-navigation-stack', la siguiente solución es para v3.

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

Un ejemplo de código más completo:

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;
Remolachas
fuente
7
Super confundido @Turnipdabeets, ¿puede proporcionar un ejemplo de código más completo (soy nuevo en React Native)?
Tom Dickson
Gracias por ayudarme ! :)
Tranvía azul
2
@Turnipdabeets Utilicé esta solución pero recibo un error " createStackNavigator()se ha movido a react-navigation-stack. Consulte reactnavigation.org/docs/4.x/stack-navigator.html para obtener más detalles". ¿Puedes ayudarme?
kb920
@ kb920 ver stackoverflow.com/questions/57817573/…
Turnipdabeets
Esto también funciona para mí. Entonces, básicamente, debes poner todo dentro de un contenedor de aplicaciones.
Lahiru Amarathunge
26

@Tom Dickson algo como esto:

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;

Luego haz referencia a él con

<App />
Damien Mason
fuente
10

Cree un nuevo archivo ScreenContainer.js (puede elegir el nombre). Luego, en el archivo ScreenContainer agregue:

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; 

Luego, en su archivo App.js:

import Container from './ScreenContainer';

class App extends Component {
  render() {
    return (
      <Container />
    );
  }
}
Labinot Bajrami
fuente
6

Aquí hay otra forma

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);
Sanjay
fuente
3
const AppNavigator = createStackNavigator({
  Home: { screen: Home },
  Friends: { screen: Friends },
});

Simple lo hice

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

En vez de

export default AppNavigator;
Ali Akram
fuente
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;   

en su archivo App.js, haga referencia a él con </container>

Dmitry
fuente
2

Tenía el código en la parte inferior

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

Simplemente lo reemplacé y funcionó a las mil maravillas. Definitivamente, es porque las actualizaciones en la biblioteca de navegación de reacción:

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

Además, incluí la biblioteca createAppContainer en react-navigation en la parte superior también.

muhammad tayyab
fuente
2

Este es para crear un navegador inferior con dos pestañas:

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;
AzizStark
fuente
0

Perdí mis 2.5 horas para obtener esta solución después de muchas búsquedas en Google ... Espero que esto funcione.

solo importa estos dos:

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

y haz un pequeño cambio en tu código como este:

crear const por encima de la clase

const AppNavigator = createAppContainer(RootStack);

y finalmente llamar a esa constante en la clase en lugar de <RootStack/>

<AppNavigator />

¡Gracias!

Shiv
fuente
-2

He estado luchando desde los últimos días.Bueno, es posible que usted también haya estado luchando por resolver si ha eliminado la navegación de reacción de package.json e instalado usando npm, verifique su proyecto de copia de seguridad y vea la versión de navegación e intente agregar el mismo y elimine los módulos de nodo y haga npm install. Espero que funcione.

Buena suerte rompiendo tu cabeza con React-Native :-)

Andy Rubin
fuente
Bienvenido a SO. Esto no parece una respuesta.
Mike Poole
Fundador de Android!
Sumit Shukla