Search code examples
react-nativereact-native-router-flux

react-native-router-flux backAndroidHandler not working


I am working on a react-native mobile application where I have used react-native-router-flux I have a scene as below

1- Screen1
2- Screen2
3- Screen3
4- Screen4

when I press android backbutton on screen 4 it goes to screen 3 then 2 then 1 but when I press android backbutton on screen1 it should exit from the application, but its not working

Here is my Router Stack

<Router navigationBarStyle={styles.navBar} titleStyle={styles.navTitle} navBarTintColor={'white'} navBarButtonImageColor={'white'} tintColor={'white'} sceneStyle={styles.routerScene} >
        <Stack key="root">
          <Scene
            key="Screen1"
            component={Screen1}
            animation="fade"
            hideNavBar={true}
            initial={true}
            type='replace'
          />
          <Scene
            key="Screen2"
            component={Screen2}
            animation="fade"
            hideNavBar={true}
            type='replace'
          />
          <Scene
            key="Screen3"
            component={Screen3}
            title="Enrollment"
            animation="slide"
            hideNavBar={false}
            type='replace'
          />
          <Scene
            key="Screen4"
            component={Screen4}
            title="Enrollment"
            animation="slide"
            hideNavBar={false}
            type='replace'
          />

I also tried using below code

componentWillMount(){
    BackHandler.addEventListener('hardwareBackPress', this.onBackPress.bind(this));
  }

  componentWillUnmount(){
    BackHandler.removeEventListener('hardwareBackPress', this.onBackPress.bind(this));
    }

  onBackPress() {
        if (backButtonPressedOnceToExit) {
            BackAndroid.exitApp();
        } else {
            if (Actions.currentScene !== 'Home') {
                Actions.pop();
                return true;
            } else {
                backButtonPressedOnceToExit = true;
                ToastAndroid.show("Press Back Button again to exit",ToastAndroid.SHORT);
                //setting timeout is optional
                setTimeout( () => { backButtonPressedOnceToExit = false }, 2000);
                return true;
            }
        }
    }

and when I try to debug this my debugger doesn't go inside the function. Please let me know what I am doing wrong.


Solution

  • Use backAndroidHandler prop of Router component.

    <Router navigationBarStyle={styles.navBar} titleStyle={styles.navTitle} navBarTintColor={'white'} navBarButtonImageColor={'white'} tintColor={'white'} sceneStyle={styles.routerScene} backAndroidHandler={this.onBackPress}>

    and in onBackPress, you mentioned the wrong screen. Home is not present in your router stack. Make it Screen1. Also 'return true` in first if condition.