'React Navigation v5 use custom header
Is it possible to have a custom header if I set the header to be off in React-Navigation V5?
I tried to, but the headerLeft and headerRight seems to do nothing, for example, I have the following:
<Stack.Screen
component={UploadStack}
name="UploadStack"
options={{ headerShown: false }}
/>
and then in my UploadStack, I have
<Stack.Navigator initialRouteName="TrackUploadSelectionScreen">
<Stack.Screen
name="AddToPlaylistScreen"
component={AddToPlaylistScreen}
/>
<Stack.Screen
name="TrackUploadSelectionScreen"
component={TrackUploadSelectionScreen}
options={{
title: t('general.selectToUpload'),
headerLeft: () =>
Platform.select({
ios: () => (
<NavigationHeader.TextButton
label={t('general.cancel')}
onPress={navigation.goBack()}
/>
),
android: () => (
<NavigationHeader.IconButton
iconName="times"
label={t('general.cancel')}
onPress={navigation.goBack()}
/>
)
})
}}
/>
</Stack.Navigator>
but it isn't creating anything
Solution 1:[1]
If you set headerShown to false everything you set for the headerLeft, headerRight and header properties is not going to be shown. So remove that line if you do want to set any of these properties.
Additionally if you want to have a custom header, instead of the default bar you can simple set the header property. Here is an example of a custom header where the bar is removed, but 2 very simple buttons are placed on the left and the right using flexbox.
// ...
<Stack.Screen
options={{
header: () => (
<View
style={{
display: 'flex',
flexDirection: 'row',
justifyContent: 'space-between',
height: 50,
}}>
<TouchableOpacity
style={{ padding: 10 }}
onPress={() => {
alert('Left');
}}>
<Text>Left</Text>
</TouchableOpacity>
<TouchableOpacity
style={{ padding: 10 }}
onPress={() => {
alert('Right');
}}>
<Text>Right</Text>
</TouchableOpacity>
</View>
),
}}
// Other props...
/>
// ...
You can adjust the styling and content to fit your needs.
Solution 2:[2]
Old thread, however I ran into a similar question. The method I found that worked was adding a function that renders react elements to the header attribute on the Stack.Navigator component. This would allow it to appear for every Stack.Screen child element.
Example as shown,
<Stack.Navigator
initialRouteName="Page1"
screenOptions={{header: NavHeader}}
>
<Stack.Screen name="Page1" component={Page1} />
<Stack.Screen name="Page2" component={Page2} />
</Stack.Navigator>
The NavHeader component can be simple react element. In this example you would simply have it as a function.
function NavHeader() {
return <View>...</View>;
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | Sam Chowdhury |
