问题
I'm using React Navigation and have a drawer navigator which contains several Stack Navigators as its items. When i open the drawer navigator and click on an item, it shows the first screen in the stack I clicked on. When I go to the second screen in the stack and then open the drawer and click on the same drawer link for the active stack, I want it to show the first screen of the stack, but instead it currently does nothing. How can I make that happen?
Here's a snack which shows the issue: https://snack.expo.io/@zeckdude/navigation-demo
/**
* Item Stack
* Follows the Items Flow chart
*/
const ItemStack = createStackNavigator(
{
Items: { screen: ItemsScreen },
Camera: { screen: CameraScreen },
ViewItem: { screen: ViewItemScreen },
AddEditItem: { screen: AddEditItemScreen },
},
{
headerMode: 'none',
navigationOptions: {
gesturesEnabled: false,
},
}
);
/**
* Send Stack
* Follows the Send Flow chart
*/
const SendStack = createStackNavigator(
{
Send: { screen: SendScreen },
ScanQR: { screen: ScanQRScreen },
SendConfirmation: { screen: SendConfirmationScreen },
},
{
headerMode: 'none',
navigationOptions: {
gesturesEnabled: false,
},
}
);
/**
* Authorized Drawer
* Used to set the labels in the drawer and enable drawer
*/
const AuthorizedDrawer = createDrawerNavigator(
{
ScanQR: {
screen: ScanQRScreen,
navigationOptions: {
drawerLabel: 'Scan'
}
},
ItemStack: {
screen: ItemStack,
navigationOptions: {
drawerLabel: 'Items'
}
},
SendStack: {
screen: SendStack,
navigationOptions: {
drawerLabel: 'Send'
}
},
},
{
initialRouteName: 'ItemStack'
}
);
/**
* Authorized Drawer Stack
* Put the drawer inside a stack so the header can be added and styled
*/
const AuthorizedDrawerStack = createStackNavigator(
{
AuthorizedDrawer: { screen: AuthorizedDrawer },
},
{
headerMode: 'float',
navigationOptions: ({navigation, screenProps, navigationOptions}) => {
return {
headerLeft: (
<View
style={{
paddingLeft: 10,
}}
>
<Icon
name={navigation.state.isDrawerOpen ? 'close' : 'menu'}
color="#2F6BAE"
onPress={() => {
navigation.toggleDrawer();
}}
/>
</View>
),
headerTitle: <Logo />
};
}
}
)
回答1:
In my project I've fully customized the contentComponent:
const DrawerNavigator = createDrawerNavigator({
screens, stacks etc...
}, {
contentComponent: SideMenu,
...
})
SideMenu is just a simple Component with navigation buttons. So I've implemented each onPress function in my custom component. And they are just navigating to the initial screen of the related stack like this:
onPress = () => {
this.props.navigation.dispatch(DrawerActions.closeDrawer());
this.props.navigation.navigate('TheInitialScreenInTheStack')
}
It works for me with React Navigation 2. And it's been very helpful to me for other things too, like signing in and out from drawer or adding redux dependent variables to tabs.
来源:https://stackoverflow.com/questions/51343113/using-react-navigation-how-can-i-force-the-drawer-navigator-to-pop-to-the-top-o