React-Navigation返回按钮异常:点击后回到初始页而非上一访问页面
看起来你的问题出在嵌套StackNavigator的导航状态管理以及跳转方式的正确性上,以下是具体的排查和修复方案:
1. 检查Redux导航Reducer的配置
因为你用Redux管理导航状态,必须确保reducer能正确处理嵌套栈的状态更新。如果你的导航reducer没有使用createNavigationReducer,子栈的导航状态不会被正确保存,导致点击返回时直接回到根栈的MainScreen。
修复方式:
确保你的导航reducer是通过createNavigationReducer创建的,示例代码:
import { createNavigationReducer } from 'react-navigation-redux-helpers'; import { RootNavigator } from './your-navigator-file'; const navReducer = createNavigationReducer(RootNavigator); // 然后在combineReducers中添加这个reducer const appReducer = combineReducers({ nav: navReducer, // 其他reducers... });
2. 修正子栈内的跳转方式
你在action creator中直接派发NavigationActions.navigate('PersonalInfo'),这种方式没有指定目标路由所在的子栈上下文,可能会被根导航处理,导致栈结构混乱。
正确的做法是:在子栈的页面(比如Register)中,通过当前页面的navigation对象来跳转,而不是直接派发全局的NavigationAction。示例:
// 在Register组件中 onNextPress = () => { this.props.navigation.navigate('PersonalInfo'); } // 然后在按钮中调用 <Button onPress={this.onNextPress}>Next to Personal Info</Button>
如果必须通过Redux action来跳转,需要指定navigationKey来定位到子栈,示例:
import { NavigationActions } from 'react-navigation'; const navToQuestionaire = (navigationKey) => NavigationActions.navigate({ routeName: 'PersonalInfo', key: navigationKey, // 这里传入子栈的navigation key }); // 在组件中调用时,传入子栈的key: dispatch(navToQuestionaire(this.props.navigation.state.key));
3. 确认嵌套栈的配置正确性
检查你的RegisterRouter配置,确保它是一个独立的StackNavigator,并且在RootNavigator中正确注册为screen(注意你的原代码里缺少闭合括号):
const RegisterRouter = StackNavigator({ Register: { screen: Register, navigationOptions: { title: 'Registration', gesturesEnabled: false } }, PersonalInfo: { screen: PersonalInfo, navigationOptions: { headerTitle: 'About you', gesturesEnabled: false } }, PickPackage: { screen: PickPackage, navigationOptions: { title: 'Packages', gesturesEnabled: false } } }); // 确保此处闭合
验证栈结构
修复后,你可以在组件中打印this.props.navigation.state来查看栈结构:
console.log(this.props.navigation.state);
正常情况下,RootNavigator的栈应该是[MainScreen, RegisterRouter],而RegisterRouter的内部栈应该是[Register, PersonalInfo, PickPackage],点击返回按钮会依次弹出内部栈的页面,直到回到Register,再点击才会回到MainScreen。
内容的提问来源于stack exchange,提问作者a.cet

