Ison
Ison

Reputation: 403

Handling BackHandler

Being a newbie in RN programming, I'm trying to handle android hardware button. But pressing it on screen leads to simultaneously going to previous screen and closing app. My StackNavigator looks like:

const navigatorApp = StackNavigator({
  Screen1: { screen: Screen1 },
  Screen2: { screen: Screen2 },
  Screen3: { screen: Screen3 },
  Screen4: { screen: Screen4 }
})

I tried to make a global backpress handling for screens like

class HandleHavigation extends React.Component {
  componentWillMount () {
    if (Platform.OS === 'android') return
    BackHandler.addEventListener('hardwareBackPress', () => {
      const { dispatch, nav } = this.props
      if (nav.routes.length === 1 && (nav.routes[0].routeName === 'Screen1')) {
        return false
      }
      dispatch({ type: 'Navigation/BACK' })
      return true
    })
  }
  componentWillUnmount () {
    if (Platform.OS === 'android') return
    BackHandler.removeEventListener('hardwareBackPress')
  }

  render () {
    return <navigatorApp navigation={addNavigationHelpers({
      dispatch: this.props.dispatch,
      state: this.props.nav,
      addListener: createReduxBoundAddListener('root')
    })} />
  }
}
const mapStateToProps = state => ({ nav: state.reducer })
export default connect(mapStateToProps)(HandleNavigation)

I also tried some given in other questions solutions, but nothing helped to prevent app closing.

I also thought about realizing backHandler on every screen. In my app every screen contains function onPress for top button. That is why I tried to copy this action to hardware button using Backhandler. But all I get - screen goes back, and the app hides at the same time.

Is there any solution in my case to prevent closing app by pressing hw backbutton?

Upvotes: 5

Views: 1277

Answers (2)

Masuk Helal Anik
Masuk Helal Anik

Reputation: 2283

Use react-navigation it has inbuilt backhandler.

Upvotes: 0

Hristo Eftimov
Hristo Eftimov

Reputation: 15713

You can use BackHandler to exit/close the application:

import { BackHandler } from 'react-native';

BackHandler.exitApp();

Upvotes: 1

Related Questions