我正在拼命寻找检查 ReactNavigation 中是否存在前一个屏幕的可能性。
如果不存在以前的路线,则使用this.props.navigation.goBack()
返回false
,但我不能使用它,因为如果存在以前的路线,我会被重定向。
是否可以检查我是否打开了应用程序而不是从另一个屏幕导航到主屏幕?
谢谢你。我没有使用 Redux。它会使这些东西更容易,但我现在想避免使用它。
我正在拼命寻找检查 ReactNavigation 中是否存在前一个屏幕的可能性。
如果不存在以前的路线,则使用this.props.navigation.goBack()
返回false
,但我不能使用它,因为如果存在以前的路线,我会被重定向。
是否可以检查我是否打开了应用程序而不是从另一个屏幕导航到主屏幕?
谢谢你。我没有使用 Redux。它会使这些东西更容易,但我现在想避免使用它。
什么可能是解决方案(不确定它是最好的)是在前一个屏幕的 param 对象中花费。这样,如果 params 存在就意味着前一个屏幕存在。
例如:
const navigateAction = NavigationActions.navigate({
routeName: 'Profile',
params: { previous_screen: 'CURRENT_SCREEN' },
action: NavigationActions.navigate({ routeName: 'NEXT_SCREEN' }),
});
this.props.navigation.dispatch(navigateAction);
然后在下一个屏幕中:
const { navigation } = this.props;
if (navigation.state.params && navigation.state.params.previous_screen) {
// A previous screen exists
} else {
// No previous screen
}
有一个更简单的方法:
if(this.props.navigation.isFirstRouteInParent()) {
//a previous screen does not exist
} else {
//a previous screen does exist
}
从 React Navigation 5 开始,您可以通过useNavigationState
这种方式在功能组件中使用钩子:
const routesLength = useNavigationState(state => state.routes.length);
console.log('routesLength', routesLength);
如果routesLength
> 1 那么它不是堆栈中的第一个屏幕
或者你可以使用 navigation.canGoBack()
const navigateAction = NavigationActions.navigate({
routeName: 'NEXT_SCREEN',
action: NavigationActions.navigate({ routeName: 'NEXT_SCREEN', params: { previous_screen: 'CURRENT_SCREEN' } }),
});
this.props.navigation.dispatch(navigateAction);
它完全适合我.... 如果您想从 React Native 应用程序的导航堆栈中找出以前的路线/屏幕名称,以便您可以使用此功能。
export const previousRouteName = (navigation) =>{
let navRoutes = navigation.dangerouslyGetParent().state.routes;
if (navRoutes.length >= 2){
return navRoutes[navRoutes.length - 2].routeName
}
return navigation.state.routeName
}
如何使用?
previousRouteName(props.navigation);
希望你喜欢 K00L 对你有帮助 ;)