NavigationContainer with multiple entries - react-native

I am trying to change an already develop react native application. I am new to react native. I am trying to write some Navigator
In App.js the original NavigationContained using GalioProvider. I know the traditional way to navigate to different pages but can anyone suggest me how to work with GalioProvider?
<NavigationContainer>
<GalioProvider theme={nowTheme}>
<Block flex>
<Screens />
</Block>
</GalioProvider>
</NavigationContainer>
I need to add below lines to it as well:
<Stack.Navigator>
<Stack.Screen name="Register" component={Register} />
<Stack.Screen name="Pro" component={Pro} />
</Stack.Navigator>
My final changes are like below:
<NavigationContainer>
<GalioProvider theme={nowTheme}>
<Block flex>
<Screens />
</Block>
</GalioProvider>
<Stack.Navigator>
<Stack.Screen name="Register" component={Register} />
<Stack.Screen name="Pro" component={Pro} />
</Stack.Navigator>
</NavigationContainer>
But I am getting below error:
Error: Another navigator is already registered for this container. You likely have multiple navigators under a single "NavigationContainer" or "Screen". Make sure each navigator is under a separate "Screen" container.

Related

Structure for nested navigation with react-native-navigation

I am currently building my first app using react-native and i am struggeling with the right structure for nested navigation using react-native-navigation .
My app should be navigatable using a Tab-bar. On every screen of that Tab-bar I might need to have a Stack navigation available.
App.js:
<NavigatonContainer>
<BottomTab.Navigator>
<BottomTab.Screen name="Screen1" component={Screen1}/>
<BottomTab.Screen name="Screen2" component={Screen2}/>
<BottomTab.Screen name="Screen3" component={Screen3}/>
<BottomTab.Navigator/>
<NavigationContainer/>
Now if i want to use a Stack navigation inside Screen1, what would be the best approach? My approach would be to move all content that should be display when the first Tab is active to a new screen called "Screen1Start" and then having following code on "Screen1".
Screen1.js:
<Stack.Navigator>
<Stack.Screen name="Screen1Start" component={Screen1Start}/>
<Stack.Screen name="Screen1Settings" component={Screen1Settings}/>
<Stack.Screen name="Screen1Details" component={Screen1Details}/>
</Stack.Navigator>
Is that the right thing to do? Are there better approaches to this? Thanks for your help!
You can have a stack inside of a stack and then navigate to each individually with navigation.navigate('name'). In the react navigation docs you can read more about navigating inside nested navigators here.
Pretty quick example would be:
function Home() {
return (
<Tab.Navigator>
<Tab.Screen name="Feed" component={Feed} />
<Tab.Screen name="Messages" component={Messages} />
</Tab.Navigator>
);
}
function App() {
return (
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen
name="Home"
component={Home}
options={{ headerShown: false }}
/>
<Stack.Screen name="Profile" component={Profile} />
<Stack.Screen name="Settings" component={Settings} />
</Stack.Navigator>
</NavigationContainer>
);
}
Here you can see that Home is a stack of feed and messages and then you have individual screens for Profile and Settings. Like so you can have another stack instead of Profile or Settings binded by another navigator such as toptab or bottomtab.
The react navigation docs explain this very detailed and easy to understand. I would recommend you to read from start to finish so you have a deeper understanding of the navigation.

How to manage stack navigation based on app module?

I am new in React Native and I want to create stack navigation based on modules like
Auth
Login
Register
Forgot
Home
Home
Dashboard
Tabs
Profile
1 - Auth stack have only above routes access where user can only navigate
2 - Home stack have only above routes access where user can navigate around home stack
Please guide here or any sample existing
This is explained with examples in react navigation authentication flows guide.
Here's simple example based on your routes -
isSignedIn ? (
<>
<Stack.Screen name="Dashboard" component={DashboardScreen} />
<Stack.Screen name="Tabs" component={TabsScreen} />
<Stack.Screen name="Profile" component={ProfileScreen} />
</>
) : (
<>
<Stack.Screen name="Login" component={LoginScreen} />
<Stack.Screen name="Register" component={RegisterScreen} />
<Stack.Screen name="Forgot" component={ForgotScreen} />
<Stack.Screen name="Home" component={HomeScreen} />
</>
);

How to implement Mini View like PipView in mobile app with React-Native

I want to implement a Mini View or Floating View (for WebRTC calling) in React-Native that should be persist or opened until we close it and it should be remain opened if we navigate to other screen any idea about this?
You can create a component and add it along with the navigation. It will appear on all the screens. You can absolutely position and apply animation as per your requirement.
<SafeAreaProvider>
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen name="login"
component={Login}
options={{
headerShown: false
}} />
<Stack.Screen name="home" component={Home} />
<Stack.Screen name="screen2" component={Screen2} />
<Stack.Screen name="screen3" component={Screen3} />
</Stack.Navigator>
<IncomingCall /> // component that is floating and shared between screens
</NavigationContainer>
</SafeAreaProvider>

How to create and use many Tab Navigator in react native?

I'm trying to create differents bottom tab navigator in a single application in react native.
At the moment I can create and use a single one properly, but I'd like to display another one when I've connected to the application by the authentification form.
Is it possible ?
Here is an example of my code that will help you to understand what I'd like to do if you didn't :
export default function AppNavigation() {
return (
<NavigationContainer>
<Tab.Navigator>
<Tab.Screen name="SignUp" component={SignUpFunction} />
<Tab.Screen name="SignIn" component={SignInFunction} />
</Tab.Navigator>
</NavigationContainer>
);
}
and I would like to create another one like :
export default function AppNavigation() {
return (
<NavigationContainer>
<Tab.Navigator>
<Tab.Screen name="SignUp" component={SignUpFunction} />
<Tab.Screen name="SignIn" component={SignInFunction} />
</Tab.Navigator>
<Tab.Navigator>
<Tab.Screen name="Profil" component={ProfilPageFunction} />
</Tab.Navigator>
</NavigationContainer>
);
}
My problem is that it is not possible having two Tab.Navigator
I don't find documentation talking about it on the internet. If you guys have one or are able to explain me how to do it would be awesome.
By mentioning 'Different tab navigators' I'll assume that you want to have tab navigators in different screens.
There are options to do this.
First one based on the tab names that you have provided, you are trying to have an authentication flow, the approach would be to render tabs based on the login state.
export default function AppNavigation() {
return (
<NavigationContainer>
{!isloggedIn?(<Tab.Navigator>
<Tab.Screen name="SignUp" component={SignUpFunction} />
<Tab.Screen name="SignIn" component={SignInFunction} />
</Tab.Navigator>):
(<Tab.Navigator>
<Tab.Screen name="Profil" component={ProfilPageFunction} />
</Tab.Navigator>)}
</NavigationContainer>
);
}
Here isloggedIn will come from your context or state or however you manage the state.
Second option is to have multiple screen in a stack navigator with tab navigators, this is called nesting navigators
inside each screen
function Home() {
return (
<Tab.Navigator>
<Tab.Screen name="Feed" component={Feed} />
<Tab.Screen name="Messages" component={Messages} />
</Tab.Navigator>
);
}
//inside the NavigationContainer
<Stack.Screen name="Home" component={Home} />
Both approaches would work

React Navigation Screen Skipped During Rendering Using `if` Statement, But Works Using Nested Ternaries

Issue: I am trying to conditionally render screens in a navigator, but it skips the first screen (GDPR), and goes to the main App screen directly even though the conditions are met.
code here:
if (!!firstLogin && !acceptedPrivacyPolicy) {
console.log('rendering....', !!firstLogin, !acceptedPrivacyPolicy)
return (
<FirstLoginStack.Navigator
headerMode={'none'}
screenOptions={{
cardStyleInterpolator:
CardStyleInterpolators.forHorizontalIOS
}}>
<FirstLoginStack.Screen name={'GDPR'} component={GDPR} />
<FirstLoginStack.Screen name={'AppTabs'} component={AppTabs} />
</FirstLoginStack.Navigator>
)
}
However, when I use a nested ternary, it works fine:
return (
<AppMainStack.Navigator
headerMode={'none'}
screenOptions={{
cardStyleInterpolator:
CardStyleInterpolators.forHorizontalIOS
}}>
{firstLogin ?
<>
{!acceptedPrivacyPolicy ? <AppMainStack.Screen name={'GDPR'} component={GDPR} /> : null}
<AppMainStack.Screen name={'AppTabs'} component={AppTabs} />
</>
: <AppMainStack.Screen name={'AppTabs'} component={AppTabs} />
}
</AppMainStack.Navigator>
)
Why is this the case?
We can define different screens based on some condition. For example, if the user is signed in, we can define Home, Profile, Settings etc. If the user is not signed in, we can define SignIn and SignUp screens.
For example:
isSignedIn ? (
<>
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Profile" component={ProfileScreen} />
<Stack.Screen name="Settings" component={SettingsScreen} />
</>
) : (
<>
<Stack.Screen name="SignIn" component={SignInScreen} />
<Stack.Screen name="SignUp" component={SignUpScreen} />
</>
)
It's already defined workflow on React Navigation Auth-Flow