我正在用 react-native v0.44.0
使用 redux v5.0.5
和 react-navigation v1.0.0-beta.11
。路由是通过嵌套导航器完成的,一个主要的 StackNavigator 和 DrawerNavigator。
我正在处理导航缩减器中的所有导航事件,以及使用 BackHandler 处理 Android 上的硬件后退。现在是奇怪的部分(对我来说),我已经实现了 BackHandler 事件处理程序,如下所示:
import { BackHandler, Modal, View } from 'react-native';
import { NavigationActions } from 'react-navigation';
import { HARDWARE_BACK_PRESS } from '../helpers/NavTypes';
constructor(props) {
super(props);
this.handleBack = this.handleBack.bind(this);
}
componentWillMount() {
BackHandler.addEventListener(HARDWARE_BACK_PRESS, this.handleBack);
}
componentWillUnmount() {
BackHandler.removeEventListener(HARDWARE_BACK_PRESS, this.handleBack);
}
handleBack() {
const navAction = NavigationActions.back();
this.props.navigation.dispatch(navAction);
return true;
}
在我的导航缩减器中,我正在处理 Navigation/BACK
操作类型并跟踪我的状态。现在,当我在我的 Android 设备或模拟器中按下硬件后退按钮时,由于 redux-logger
和 React Native 调试器,我可以看到导航操作已正确调度,之前的显示的屏幕出现,但应用程序仍然关闭。当我将 handleBack
方法更改为如下内容时,也会发生这种情况:
handleBack() {
return true;
}
每次按下硬件后退按钮时,应用程序仍会关闭。我在 node_modules/react-native/Libraries/Utilities/BackHandler.android.js
中进行了一些逐步调试,在 RCTDeviceEventEmitter.addListener
中,我可以看到我的事件监听器是已注册并且 invokeDefault
在循环中设置为 true
。 addListener
已退出,但 App 仍然关闭。有谁知道 react 导航和 redux 是否在某些我不知道的顶层覆盖了硬件后退按钮的行为?
我已经设置了第二个没有反应导航和 redux 的普通 RN 项目,实现相同的 BackHandler 事件监听器(也返回 true)并且应用程序不会关闭。所以,现在这让我有点困惑。
最佳答案
我正在使用 react-navigation,我还处理操作系统后退按钮。这对我来说可以。 也许你可以试试这个。请注意,如果您正在执行除关闭应用程序之外的任何其他任务,则 handleBack 必须返回 true。如果不是,它将立即关闭该应用程序。
componentWillMount() {
BackHandler.addEventListener(HARDWARE_BACK_PRESS, () => { return this.handleBack.bind(this)() });
}
关于javascript - React-Native BackHandler 总是在 Android 中关闭 App(硬件回退),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46442568/