因此,我在Android中遇到React Native问题。我有以下导航器:
const AppStackNavigator = createStackNavigator({
loginFlow: createStackNavigator({
Start: { screen: Start },
Signup: { screen: Signup },
Login: { screen: Login },
},{
headerMode: "none",
initialRouteName: "loginFlow",
})
});
有了这个,我有3个屏幕,开始,注册和登录,其中loginFlow
是initialRouteName
。 Start.js
包含以下内容:
componentDidMount() {
BackHandler.addEventListener("hardwareBackPress", this.handleBackButton);
}
handleBackButton() {
// Logic to increment backPresses removed, opens as Alert (confirm)
if(global.backPresses >= 2){
BackHandler.exitApp();
}
return true;
}
render() {
return (
<Row>
<Col>
<Button full onPress={() => this.props.navigation.navigate("Signup")}>
<Text>{"Sign Up"}</Text>
</Button>
</Col>
<Col>
<Button full onPress={() => this.props.navigation.navigate("Login")}>
<Text>{"Log In"}</Text>
</Button>
</Col>
</Row>
);
}
本质上,Start.js
充当注册和登录的中心。 最重要的是,它将hardwareBackPress
事件监听器设置为return true;
,以全局禁用Android后退按钮,除非捕获到后退按钮的双击(为简便起见,已删除逻辑)清酒)。
在“开始”上按后退按钮,或导航到“注册/登录”,然后按后退按钮不会执行任何操作,这是预期的行为。
此功能都很好用,直到调用Backhandler.exitApp()
,关闭应用程序然后重新打开它为止。发生这种情况时,“开始”按钮上的“后退”按钮将被禁用,但是一旦导航到“注册/登录”,我便可以按“后退”按钮并返回到“开始”,这不是预期的功能。 >
总结:
我认为这是BackHandler.exitApp();
的问题,因为仅全局禁用后退按钮就可以了。但是我无法弄清楚。重新打开应用程序时,该代码似乎可以正常工作,但在向前导航后似乎不再适用。另外,我从未删除过事件侦听器,如步骤4的结果所示,但似乎有一些阻止它。
还有其他人看到过这个问题吗?
答案 0 :(得分:0)
在将要注册的组件中,您可以使用退出应用程序功能为后代添加事件监听器。这将有助于它不会将您重定向到开始屏幕,而只是关闭您的应用程序。
答案 1 :(得分:0)
componentWillUnmount中的removeEventListener不能解决此问题吗?
componentDidMount() {
BackHandler.addEventListener("hardwareBackPress", this.handleBackButton);
}
componentWillUnmount() {
BackHandler.removeEventListener("hardwareBackPress", this.handleBackButton);
}
handleBackButton() {
// Logic to increment backPresses removed, opens as Alert (confirm)
if(global.backPresses >= 2){
BackHandler.exitApp();
}
return true;
}
调用componentWillUnmount不会删除后退按钮的全局侦听器,因为Start.js View仅在用户关闭应用程序时才会被卸载。通过导航器导航到其他视图时,即使该组件不可见(至少这是react-native-navigation中的行为),该组件仍保持安装状态。