簡體   English   中英

React Native-Android-全局禁用后退按鈕的問題

[英]React Native - Android - Issue with Disabling Back Button Globally

因此,我在Android中遇到了React Native問題。 我有以下導航器:

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

有了這個,我有3個屏幕,開始,注冊和登錄,而loginFlowinitialRouteName 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() 發生這種情況時,“開始”按鈕上的“后退”按鈕被禁用,但是一旦導航到“注冊/登錄”,我就可以按“后退”按鈕並返回到“開始”按鈕,這不是預期的功能。

總結一下:

  1. 開啟應用程式
  2. 按下返回(無)
  3. 向前瀏覽
  4. 按下返回(無)
  5. 雙擊返回(退出,確認)
  6. 重新開啟應用程式
  7. 按下返回(無)
  8. 向前瀏覽
  9. 按下返回(向后導航) 問題

我相信這是BackHandler.exitApp();的問題BackHandler.exitApp(); ,因為只需全局禁用后退按鈕就可以正常工作。 但是我無法弄清楚。 重新打開應用程序時,該代碼似乎可以正常工作,但在向前導航后似乎不再適用。 而且,我從不刪除事件偵聽器,如步驟4的結果所示,但似乎有一些阻止它。

還有其他人看到過這個問題嗎?

在將要注冊的組件中,您可以使用退出應用程序功能為后代添加事件監聽器。 這將有助於它不會將您重定向到“開始”屏幕,而只是關閉您的應用程序。

不能在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中的行為)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM