Search code examples
reactjsreact-nativenavigation-drawerreact-navigation

native.createnavigator factory is not a function


I am going to design a Drawer navigation in my project.

I installed that by this command:

npm install @react-navigation/drawer

Then imported that into App.js

import { createDrawerNavigator } from '@react-navigation/drawer';
import { NavigationContainer } from '@react-navigation/native';

This is my package.json content:

"@react-native-community/masked-view": "^0.1.6",
"@react-navigation/drawer": "^5.0.0",
"react": "16.9.0",
"react-native": "0.61.5",
"react-native-gesture-handler": "^1.5.6",
"react-native-reanimated": "^1.7.0",
"react-native-screens": "^2.0.0-beta.1",
"react-native-view-shot": "^3.0.2",
"react-navigation": "^4.1.1",
"react-navigation-stack": "^2.1.0",

This is my App.js content:

const App = () => {
  const Drawer = createDrawerNavigator();
  return (
    <View style={styles.container}>
      <NavigationContainer>
        <Drawer.Navigator initialRouteName="login">
          <Drawer.Screen name="login" component={Login} />
          <Drawer.Screen name="second" component={SecondPage} />
        </Drawer.Navigator>
      </NavigationContainer>
    </View>
  )
};

I should say that I've already created Login and SecondPage components and declared them in a file named root.js

import { createAppContainer } from 'react-navigation';
import { createStackNavigator } from 'react-navigation-stack';
import { Login, Header, SecondPage, Footer, ThirdPage } from './components/index';

const AppNavigator = createStackNavigator({
  login: { screen: Login },
  header: { screen: Header },
  second: { screen: SecondPage },
  footer: { screen: Footer },
  third: { screen: ThirdPage }
}, {
  initialRouteName: 'login',
  headerMode: 'none',
  mode: 'modal',
}, {});

export default createAppContainer(AppNavigator);

But i'm getting an error (following screen).

How can i fix this?

enter image description here

index.js

export * from './login';
export * from './header';
export * from './secondpage';
export * from './footer';
export * from './thirdpage';

Solution

  • I don't understand what you're trying to do now. I think you want to add a drawer Navigator.

    Your problem is you have to use one container, but you have two, and createStackNavigator has two parameters, but you have three.

    createStackNavigator(RouteConfigs, StackNavigatorConfig);

    I think your navigator structure should be as follows.

    Drawers.js

    export default const Drawers = () => {
      const Drawer = createDrawerNavigator();
      return (
            <Drawer.Navigator initialRouteName="login">
              <Drawer.Screen name="login" component={Login} />
              <Drawer.Screen name="second" component={SecondPage} />
            </Drawer.Navigator>
      )
    };
    

    App.js

    import Drawers from "./Drawers"
    ...
    
    const AppNavigator = createStackNavigator({
      login: { screen: Drawers },
      header: { screen: Header },
      second: { screen: SecondPage },
      footer: { screen: Footer },
      third: { screen: ThirdPage }
    }, {
      initialRouteName: 'login',
      headerMode: 'none',
      mode: 'modal',
    });
    
    export default createAppContainer(AppNavigator)
    

    index.js

    import Login from './login';
    import Header from './header';
    import SecondPage from './secondpage';
    import Footer from './footer';
    import ThirdPage from './thirdpage';
    
    export { Login, Header, SecondPage, Footer, ThirdPage}
    

    OR

    This issue can be a compatibility issue with the version. React-Navigation and StackNavigator versions must be up to date.