【问题标题】:Unmount all previously mounted screens to exit the app on back press卸载所有先前安装的屏幕以在后按时退出应用程序
【发布时间】:2020-06-06 19:32:04
【问题描述】:

我有一个要求,我需要在按下后退按钮时退出应用程序。基本上我尝试了BackHandler API,它可以工作但有一定的限制。所以就我而言,我觉得最好的方法是卸载所有以前安装的组件,这样当前屏幕就成为堆栈中的第一个屏幕。

我有以下屏幕:

登录
OtpVerification
名称
电子邮件
. . .还有更多

我需要的是,当我在 Name 屏幕上时,如果有人按下后退按钮,应用程序应该退出。但如果有人在 Email 屏幕上,用户应该只能返回到 Name 屏幕。

使用 BackHandler 的片段

constructor(props) {
    super(props);
    .
    .
    BackHandler.addEventListener("hardwareBackPress", this._handleBackPress);
}
.
.
.
.
_handleBackPress = () => {
    BackHandler.exitApp();
};
.
.
.
.
_onPress = () => {
    BackHandler.removeEventListener("hardwareBackPress", this._handleBackPress);
    this.props.navigation.navigate("Email", { name: this.state.name });
};

【问题讨论】:

  • 你使用的是什么版本的 react-navigation?
  • @LonelyCpp 版本 5

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


【解决方案1】:

解决方案是在导航到名称屏幕之前重置堆栈导航器。

使用 react-navigation 中的 reset 操作来执行此操作。 documentation

执行此操作的函数的一个简单示例是 -

react-navigation 5 - 使用CommonActions

    import { CommonActions } from '@react-navigation/native';


    reset = (routeName) => {
        return navigation.dispatch(CommonActions.reset(
                     {
                        index: 0,
                        routes: [{ name: routeName }]
                     }
                  ));
      }

反应导航 v4.x

reset = (routeName) => {
    return this.props
               .navigation
               .dispatch(NavigationActions.reset(
                 {
                    index: 0,
                    actions: [
                      NavigationActions.navigate({ routeName })
                    ]
                  }));
  }

将其放入OtpVerification 屏幕并在导航到NameScreen 时调用reset('NameScreen')

相关答案-https://stackoverflow.com/a/43121263/3262983

【讨论】:

  • 这看起来不像它的版本 5。我也不确定这是否会退出应用程序,因为我尝试了类似的东西,它总是带我进入登录屏幕。
  • 我为第 5 版添加了一个示例。试试看:)
  • 那我应该怎么调用reset呢?之前this.props.navigation.navigate("NameScreen");
  • 不要调用导航! reset 将导航到您给它的任何屏幕。只需致电reset("NameScreen");
  • 它确实完全关闭了应用程序。如果您在谈论 android 中的“最近的应用程序”,那将需要一些 android 特定的配置。 stackoverflow.com/questions/3762763/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多