javascript - React-Native BackHandler 总是在 Android 中关闭 App(硬件回退)

标签 javascript android react-native redux react-navigation

我正在用 react-native v0.44.0 使用 redux v5.0.5react-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 在循环中设置为 trueaddListener 已退出,但 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/

相关文章:

java - openFileOutput 抛出异常

react-native - JSON解析错误: Unrecognized token '<' - React Native

javascript - 在 React js 中收到错误 "this.props.sumOfPrices is not a function"?

javascript - 如何在 React Native 中将两个按钮并排放置在背景顶部和屏幕底部?

javascript - 是否可以不使用 pick 方法来存储文件?

javascript - AngularJS 和 Node.js 与 ExpressJS 集成

Android - SimpleCursorAdapter.ViewBinder - 设置背景颜色

php - 是否可以创建没有标题的墙贴?

javascript - 使用 .getJSON 的 JSONP 返回未定义

android - Eclipse 无法在三星 galaxy S4 上调试 android 应用程序