React-Native BackHandler总是关闭Android中的应用程序(硬件返回)

时间:2017-09-27 08:05:53

标签: javascript android react-native redux react-navigation

我使用react-native v0.44.0redux 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在循环中设置为trueaddListener已退出,但应用仍会关闭。有没有人知道是否有一点反应 - 导航和redux覆盖了某些顶级硬件后退按钮的行为我不知道?
我设置了第二个没有react-navigation和redux的普通RN项目,实现了相同的BackHandler事件监听器(也返回true),应用程序不会关闭。所以,现在这让我有些困惑。

2 个答案:

答案 0 :(得分:0)

我正在使用react-navigation,我也处理了os后退按钮。这对我来说可以。 也许你可以尝试一下。请注意,如果您执行除关闭应用程序之外的任何其他任务,则handleBack必须返回true。如果没有,它会立即关闭应用程序。

 componentWillMount() {
  BackHandler.addEventListener(HARDWARE_BACK_PRESS, () => { return this.handleBack.bind(this)() });
}

答案 1 :(得分:0)

我遇到了同样的问题,返回true无法更新。更改后再次运行react-native run-android为我解决了问题。