React Native - Device back button handling

后端 未结 9 1971
感情败类
感情败类 2020-12-02 18:33

I want to check if there are more than one screens are on stack when device back button is hit. If yes, I want to show previous screen and if no, I want to exit app.

相关标签:
9条回答
  • 2020-12-02 19:05

    Here is how I implemented successfully using certain condition:

    componentWillMount() {
        BackHandler.addEventListener(
          'hardwareBackPress',
          this.handleBackButtonClick,
        );
      }
    
      componentWillUnmount() {
        BackHandler.removeEventListener(
          'hardwareBackPress',
          this.handleBackButtonClick,
        );
      }
    
      handleBackButtonClick = () => {
        //some condition
        if (this.state.isSearchBarActive) {
          this.setState({
            isSearchBarActive: false,
          });
          this.props.navigation.goBack(null);
          return true;
        }
        return false;
      };
    
    0 讨论(0)
  • 2020-12-02 19:06

    try this react navigation

    componentDidMount() {
            BackHandler.addEventListener('hardwareBackPress', this.handleBackButton);
        }
    
    
        handleBackButton = () => {
    
            const pushAction = StackActions.push({
                routeName: 'DefaultSelections',
            });
    
            this.props.navigation.dispatch(pushAction);
        }
    

    current screen is "DefaultSelections" , on back button press, would be shifted on to the same and hence back button disabled work around, as disabling back button by

    return true
    

    for backButton ( as suggested by the official docs ) disables back button on all screens ; not wanted

    0 讨论(0)
  • 2020-12-02 19:13

    In a case where there are more than one screens stacked in the stack, the default back button behavior in react-native is to navigate back to the previous screen in the stack. Handling the device back button press when having only one screen to exit the app requires a custom setting. Yet this can be achieved without having to add back handling code to each and every screen by modifying the getStateForAction method of the particular StackNavigator's router.

    Suppose you have the following StackNavigator used in the application

    const ScreenStack = StackNavigator(
      {
        'Screen1': {
          screen: Screen1
        },
        'Screen2': {
          screen: Screen2
        },
      },
      {
        initialRouteName: 'Screen1'
      }
    );
    

    The getStateForAction method of the stack navigator's router can be modified as follows to achieve the expected back behavior.

    const defaultStackGetStateForAction =
      ScreenStack.router.getStateForAction;
    
    ScreenStack.router.getStateForAction = (action, state) => {
      if(state.index === 0 && action.type === NavigationActions.BACK){
        BackHandler.exitApp();
        return null;
      }
    
      return defaultStackGetStateForAction(action, state);
    };
    

    the state.index becomes 0 only when there is one screen in the stack.

    0 讨论(0)
提交回复
热议问题