我也在使用带有 2 个堆栈的底部选项卡导航器。我遇到了类似的问题并同意@Max的解释。由于我的通知屏幕位于堆栈 1 中,我必须在导航到详细信息屏幕后返回通知。搜索修复后,我正在使用此解决方法(适用于 v6)。
Tab 1 - Stack 1 (Home > Notification screen)
Tab 2 - Stack 2 (Reward Home > Reward Detail screen)
从 Notification 导航到 RewardDetail 时,我传递了一个参数。然后我重写headerLeft
并使用BackHandler
来处理Android返回函数。
通知.js
navigation.navigate('RewardStack', {
screen: 'RewardDetail',
initial: false,
params:{notification: notification_data_source}
})
奖励细节.js
const payload = route.params.notification
//1. override headerLeft button
useLayoutEffect(() => {
if(payload)
navigation.setOptions({
headerLeft: () => (
<Button
TouchableComponent={TouchableOpacity}
buttonStyle={{paddingTop:4, paddingLeft:0}}
type='clear'
icon={<Icon name={'chevron-left'} size={30} style={{color:'#FFF'}} />}
onPress={()=>{
navigation.goBack()
navigation.navigate('Notification') //can use this only
}}
/>
)
})
}, [navigation]);
//2. Add BackHandler
useEffect(() => {
const onBackPress = () => {
if (payload) {
navigation.goBack()
navigation.navigate('Notification') //can use this only
return true
} else {
return false
}
}
BackHandler.addEventListener('hardwareBackPress', onBackPress)
return () => BackHandler.removeEventListener('hardwareBackPress', onBackPress)
}, [navigation]);
我可以只使用navigation.navigate('Notification')
返回通知,但这将导致详细信息屏幕保持安装在堆栈 2 中。我希望堆栈 2 在返回通知后返回到 RewardHome。因此我使用了:
navigation.goBack() //pop screen to RewardHome
navigation.navigate('Notification') //jump to Notification