React Native-Android-全局禁用后退按钮的问题

时间:2018-09-28 20:40:31

标签: javascript android react-native

因此,我在Android中遇到React Native问题。我有以下导航器:

const AppStackNavigator = createStackNavigator({
    loginFlow: createStackNavigator({
        Start: { screen: Start },
        Signup: { screen: Signup },
        Login: { screen: Login },
    },{
        headerMode: "none",
        initialRouteName: "loginFlow",
    })
});

有了这个,我有3个屏幕,开始,注册和登录,其中loginFlowinitialRouteNameStart.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(),关闭应用程序然后重新打开它为止。发生这种情况时,“开始”按钮上的“后退”按钮将被禁用,但是一旦导航到“注册/登录”,我便可以按“后退”按钮并返回到“开始”,这不是预期的功能。 >

总结:

  1. 打开应用
  2. 按Back(无)
  3. 向前导航
  4. 按Back(无)
  5. 按两次返回(退出,确认)
  6. 重新打开应用程序
  7. 按Back(无)
  8. 向前导航
  9. 按Back(后退)问题

我认为这是BackHandler.exitApp();的问题,因为仅全局禁用后退按钮就可以了。但是我无法弄清楚。重新打开应用程序时,该代码似乎可以正常工作,但在向前导航后似乎不再适用。另外,我从未删除过事件侦听器,如步骤4的结果所示,但似乎有一些阻止它。

还有其他人看到过这个问题吗?

2 个答案:

答案 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中的行为),该组件仍保持安装状态。