遇到問題:
項目中用到的路由組件是react-navigation,當使用常規方法(監聽backHandleer進行操作)時,所有頁面都會監聽返回按鈕,并且this.props.navigation的值為該段代碼所在的頁面,因此無法得到點擊返回按鈕時的當前頁面,即無法實現特定頁面退出程序和另外頁面返回上級的功能。
解決方案:
使用react-native-back-android組件。
具體使用方法:
在TabNavigator定義頁面:
mport backAndroid, {
hardwareBackPress,
exitApp
} from 'react-native-back-android';
const FescoZP = StackNavigator(
{
//Filter:{screen:FilterScreen},
Login: {screen: hardwareBackPress(LoginScreen)},
Authen:{screen: AuthenScreen},
MainScreen:{screen: MainScreenNavigator},
//Filter: { screen: FilterScreen},
Filter: { screen: hardwareBackPress(FilterScreenBK)},
Map: {screen: hardwareBackPress(MapScreen)},
SetUp: {screen: hardwareBackPress(SetUpScreen)}
}
),
AppRegistry.registerComponent('FescoZP', () => backAndroid(FescoZP));
其中,在路由棧中,在最頂層的頁面(本例為“login”)中實現handleHardwareBackPress方法,則在剩下其他頁面都可以監聽到該方法,如果想在其他頁面阻止該方法的實現,只能重新實現handleHardwareBackPress。
在本例中:LoginScreen.js 片段:
handleHardwareBackPress = () => {
Alert.alert(
'Quiting',
'Want to quit?',
[
{
text: 'Cancel',
onPress: () => console.log('Cancel Pressed'),
style: 'cancel'
},
{ text: 'OK', onPress: () => exitApp() }
],
{ cancelable: false }
);
// return true to stop bubbling
return true
};
FilterScreen.js 代碼片段:
handleHardwareBackPress = () => {
const { goBack } = this.props.navigation
console.warn('6666');
goBack();
// return true to stop bubbling
return true
};