【问题标题】:React-Native BackHandler always closes App in Android (hardware back)React-Native BackHandler 总是关闭 Android 中的 App(硬件返回)
【发布时间】:2018-03-08 15:05:05
【问题描述】:

我正在使用redux v5.0.5react-navigation v1.0.0-beta.11 构建一个带有react-native v0.44.0 的应用程序。路由是通过嵌套导航器、一​​个主 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 设备或模拟器中按下硬件后退按钮时,感谢@​​987654327@ 和 React Native 调试器,我可以看到导航操作已正确分派,并且出现了之前显示的屏幕,但应用程序反正关闭。当我将 handleBack 方法更改为以下内容时也会发生这种情况:

handleBack() {
  return true;
}

每次按下硬件返回按钮时,应用程序仍会关闭。我在node_modules/react-native/Libraries/Utilities/BackHandler.android.jsRCTDeviceEventEmitter.addListener 内部做了一些步骤调试,我可以看到我的事件侦听器已注册并且invokeDefault 在循环中设置为trueaddListener 已退出,但应用程序仍会关闭。有谁知道 react-navigation 和 redux 是否在某些我不知道的顶层覆盖了硬件后退按钮的行为?
我已经设置了第二个没有 react-navigation 和 redux 的普通 RN 项目,实现了相同的 BackHandler 事件侦听器(也返回 true)并且应用程序不会关闭。所以,现在这让我有点困惑。

【问题讨论】:

  • 我也遇到了同样的问题,对你有用吗?
  • @Anjana-Systematix 最重要的是,在那个项目中,我们更新到了更新的react-nativereduxreact-navigation 版本,现在一切正常。但是我已经使用仍然存在问题的旧模块创建了该项目的一个分支,只要我有一些空闲时间,我会尝试找出该实现有什么问题。
  • 我的问题已通过 Victoriayangx 在此链接github.com/facebook/react-native/issues/15497 中给出的解决方案得到解决

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


【解决方案1】:

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

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

【讨论】:

  • 嗨@csath,谢谢你的回答。但这并没有改变什么。正如我所说,我什至可以将handleBack 更改为始终返回true,并且应用程序仍然会关闭。我不知道我可以在哪里更深入地探索这个问题。现在我正在阅读 adb logcat 日志,看看是否有任何提示“推翻”硬件回压来自哪里。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2019-02-23
    • 2017-01-19
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    相关资源
    最近更新 更多