React Native 侧滑返回自定义跳转页面出现最大调用栈溢出问题求解
报错原因
- 你注册的
beforeRemove监听会在当前页面所有即将被移除的场景下触发,包括你主动调用navigation.navigate('MenuScreen')的场景。跳转到MenuScreen时会先触发PaymentScreen的移除逻辑,此时会再次进入你的监听回调:你又一次阻止了移除动作,同时再次调用跳转MenuScreen的逻辑,由此形成无限循环,最终触发调用栈溢出。 - 额外问题:你没有在useEffect的清理函数中卸载监听,也会导致逻辑异常和内存泄漏。
可行解决方法
方法1:给监听逻辑加动作判断(适配自定义返回逻辑场景)
仅当用户触发返回动作(侧滑、点击系统返回键、点击导航栏返回按钮)时走自定义跳转逻辑,主动跳转的场景直接放行,避免循环:
useEffect(() => { const unsubscribe = navigation.addListener('beforeRemove', e => { // 仅处理返回类动作,排除主动跳转的场景 if (e.data.action.type !== 'GO_BACK' && e.data.action.type !== 'POP') { return } e.preventDefault() // 用reset方法重置页面栈,避免残留无效页面 navigation.reset({ index: 0, routes: [{ name: 'MenuScreen' }] }) }) // 卸载监听避免内存泄漏 return unsubscribe }, [navigation])
方法2:跳转时直接配置页面栈(推荐,无额外监听成本)
从CartScreen跳转到PaymentScreen时,直接用replace方法替换当前栈内的CartScreen,PaymentScreen的默认返回目标自动变成MenuScreen,无需额外加监听:
// 在CartScreen的跳转逻辑中调用,直接替换当前页面为PaymentScreen navigation.replace('PaymentScreen')
方法3:popToTop快速返回栈顶
如果MenuScreen是当前导航栈的第一个页面,直接调用popToTop一步返回栈顶即可:
useEffect(() => { const unsubscribe = navigation.addListener('beforeRemove', e => { if (e.data.action.type !== 'GO_BACK') return e.preventDefault() navigation.popToTop() }) return unsubscribe }, [navigation])
内容的提问来源于stack exchange,提问作者Mohamed Ahmed
相关产品推荐
相关产品推荐

