在APP层级下,监听安卓返回键,如何对特定的页面进行处理?



  • 在APP这个页面中,使用了react-navigation对应用的整个路由进行定义,其基本结构就像下面这样
    **export default App extends Component<Props>{
    conponentWillMount(){
    BackHandler.addEventListener('hardwareBackPress', this.onBackClicked);
    }
    componentWillUnmount() {
    //取消对返回键的监听
    BackHandler.removeEventListener('hardwareBackPress', this.onBackClicked);
    }
    //BACK物理按键监听
    onBackClicked = () => {
    const {route} = store.dataFixStore;
    if (route != 'Home' && route!='siteEmail') {
    return true;//true 表示返回上一页
    }else if (route == 'siteEmail'){
    this.handleMoreSelect()
    } else {
    if (this.lastBackPressed && this.lastBackPressed + 500 >= Date.now()) { 
    //最近0.5秒内按过back键,可以退出应用。
      return false;       
    }
    ToastAndroid.show("再按一次退出应用", ToastAndroid.SHORT);
    this.lastBackPressed = Date.now();
    return true;
    }

    }
    handleMoreSelect = () => {
    if (store.dataFixStore.seleteMoreSite){
    return false
    } else {
    return true

    }
    

    }

    render() {
    return (
    <View style={{flex:1}}>
    <Provider {...store}>
    <AppContainer></AppContainer>
    </Provider>
    </View>
    );
    }

    }

    const Tab = createBottomTabNavigator({//tab页面的定义},{})
    const Stack = createStackNavigator({Home:{screen:Tab}},{})
    const AppContainer = createAppContainer(Stack)**

    因为这样写props.navigation是监听不到页面的路由的(尝试打印,没有任何结果,返回的pops中没有navigation),所以使用mobx,当进入一些页面的时候就对特定的页面的值赋给全局变量route,根据当前route的值进行相应的处理。这样监听是可以的,但是奇怪的是在APP中相应的处理函数打印的时候没有任何结果,而且在监听route=siteEmail的时候也不会有特定的处理,而是返回上一页。请问如果我想要在route=siteEmail的时候,作其他的处理,应该怎么做??
    https://stackoverflow.com/questions/56962305/react-native-listens-to-android-return-key-to-exit-multiple-select



  • 在onBackClicked 打印下route看看



  • 如果没有特殊的业务需求,我是用特定的页面再写backHandler来处理这种场景的。
    App层级的返回键监听功能也不会受影响。






Log in to reply