简体   繁体   中英

React Navigation - Navigation options with nested navigators

Im still learning React Native. I kinda know how React Navigation works. Now Im getting a little bit stuck with Navigation Nesting. Im gonna try to be quick.

First, whats the practical way to nest navigators?

I was doing it somehow using nesting, but came across with a problem. Im only able to change navigation options in the nested navigator not in the component screen. I have difficulties opening the drawer menu from one of the screens since Im using a custom header plus using nested navigators. I have a similar code Im using for testing:

App.js (Navigators)

 import React, { Component } from 'react'; import { createStackNavigator, createDrawerNavigator, createBottomTabNavigator, createAppContainer } from 'react-navigation'; import SplashScreen from './SplashScreen'; import MainScreen from './MainScreen'; import FirstTabScreen from './FirstTabScreen'; import SecondTabScreen from './SecondTabScreen'; const AppStackNavigator = createStackNavigator({ splash: { screen: SplashScreen }, mainFlow: { screen: createDrawerNavigator({ main: { screen: MainScreen }, someTab: { screen: createBottomTabNavigator({ firstTab: { screen: FirstTabScreen }, secondTab: { screen: SecondTabScreen } }) } }) } }); const AppContainer = createAppContainer(AppStackNavigator); export default class App extends Component{ render(){ return <AppContainer/>; } } 

Above code will launch SplashScreen which is good and has the following:

SplashScreen.js

 import React, { Component } from 'react'; import { Button, View } from 'react-native'; export default class SplashScreen extends Component { static navigationOptions = { header: null } go = () =>{ this.props.navigation.navigate('main'); } render() { return ( <View> <Button title='GO NEXT SCREEN' onPress={this.go}/> </View> ); } } 

In this screen navigation options work in the same code and its as expected. Everything cool for now, when I press the button and go to the next screen which is MainScreen:

MainScreen.js

 import React, { Component } from 'react'; import { Text, StyleSheet, Button, View } from 'react-native'; export default class MainScreen extends Component { static navigationOptions = { header: null } drawer = () => { this.props.navigation.openDrawer(); } render() { return ( <View> <Text style={styles.baseText}>HELLO</Text> <Button title='DRAWER' onPress={this.drawer}/> </View> ); } } const styles = StyleSheet.create({ baseText: { fontFamily: 'Cochin', }, titleText: { fontSize: 20, fontWeight: 'bold', }, }); 

Here is the problem, navigation options wont work here, so I was trying setting those lines in the navigator itself and it works if I configure header as null but if I want to control 'props.navigation' it will say 'this.props.navigation' is undefined.

So, ideal question would be, is there a way to make navigation options available from the screen component itself? somehow? or is there a way I can put this navigation options inside the navigator with working navigation props that wont say its undefined?

All this is because I want to customize my header

Thanks a lot!

You need to use withNavigation to provide navigation prop there,

See my answer here

In SplashScreen.js you are not navigating to the right screen

you have to do

go = () =>{
        this.props.navigation.navigate('mainFlow');
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM