Stack Navigator - Move Between Screens
In the previous section Hello React Navigation we defined a stack navigator with two routes Home
and Details
, but we didn’t know how to let the user go from Home
to Details
.
If it was a web browser, we could write something like this:
<a href="details.html">Go to Details</a>
<a
onClick={() => {
window.location.href = 'details.html'
}}
>
Go to Details
</a>
We'll do something like this, but instead of using the global window window.location we will use the navigation
property that is passed to our screen components.
Go to new screen
import * as React from 'react'
import { View, Button, Text } from 'react-native'
import { NavigationContainer } from '@react-navigation/native'
import { createStackNavigator } from '@react-navigation/stack'
const HomeScreen = ({ navigation }) => (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>Home Screen</Text>
<Button title="Go to Details" onPress={() => navigation.navigate('Details')} />
</View>
)
const DetailsScreen = () => (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>Details Screen</Text>
</View>
)
const Stack = createStackNavigator()
const App = () => (
<NavigationContainer>
<Stack.Navigator initialRouteName="Home">
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Details" component={DetailsScreen} />
</Stack.Navigator>
</NavigationContainer>
)
export default App
Let's deal with this:
navigation
- thenavigation
property is passed to each screen component in the stack navigator.navigate ('Details')
- we call thenavigate
function with the name of the route we would like to navigate the user.
If we call navigation.navigate
with a route name that we did not define in the navigator, it will throw an error in development assemblies and nothing will happen in production assemblies. In other words, we can only jump to routes that have been defined in our navigator - we cannot jump to an arbitrary component.
Back button
The header provided by the stack navigator will automatically include a return button when you can return from the active screen. If there is only one screen in the navigation stack, there is nothing to go back to, then there will be no back button.
Sometimes you need to be able to programmatically trigger this behavior, and for that you can use navigation.goBack()
<Button title="Go back" onPress={() => navigation.goBack()} />
Back to top
Sometimes we need to take the user back several screens at once. This is done using navigation.popToTop()
<Button title="Go back to first screen in stack" onPress={() => navigation.popToTop()} />
Done
To see how well you learned this lesson, take the test in our school's mobile app on this topic or in Telegram bot.
Links
Contributors ✨
Thanks goes to these wonderful people (emoji key):
Dmitriy Vasilev 💲 |