React Native - 设备后退按钮处理

Vir*_*t18 23 navigation back-button back react-native react-native-android

我想检查当设备后退按钮被击中时是否有多个屏幕在堆栈上.如果是,我想显示前一个屏幕,如果没有,我想退出应用程序.

我已经检查了一些示例,但是那些使用了BackAndroid和Navigator.但他们俩都被弃用了.BackHandler是BackAndroid的替代品.我可以使用props.navigation.goBack(null)显示上一个屏幕.

但是我无法找到用于在堆栈中查找屏幕计数的代码.我不想使用已弃用的Navigator!

Vir*_*t18 54

此示例将向您显示通常在大多数流程中预期的返回导航.您必须根据预期的行为向每个屏幕添加以下代码.有两种情况:1.如果堆叠屏幕超过1个,设备后退按钮将显示前一个屏幕.2.如果堆叠中只有一个屏幕,设备后退按钮将退出应用程序.

案例1:显示上一个屏幕

import { BackHandler } from 'react-native';

constructor(props) {
    super(props)
    this.handleBackButtonClick = this.handleBackButtonClick.bind(this);
}

componentWillMount() {
    BackHandler.addEventListener('hardwareBackPress', this.handleBackButtonClick);
}

componentWillUnmount() {
    BackHandler.removeEventListener('hardwareBackPress', this.handleBackButtonClick);
}

handleBackButtonClick() {
    this.props.navigation.goBack(null);
    return true;
}
Run Code Online (Sandbox Code Playgroud)

重要提示:不要忘记在构造函数中绑定方法并删除co​​mponentWillUnmount中的侦听器.

案例2:退出应用程序

在这种情况下,无需在要退出应用程序的屏幕上处理任何内容.

重要提示:这应该只是堆栈屏幕.

  • 如果我们以这种方式处理,我们必须为所有屏幕处理它.有没有办法全球处理???? (4认同)
  • 如果您像这样使用 *arrow* 函数,则不必“绑定”该方法:`handleBackButtonClick = () => {...}` (2认同)

Aur*_*ana 31

在功能组件中:

import { BackHandler } from 'react-native';

function handleBackButtonClick() {
    navigation.goBack();
    return true;
  }

  useEffect(() => {
    BackHandler.addEventListener('hardwareBackPress', handleBackButtonClick);
    return () => {
      BackHandler.removeEventListener('hardwareBackPress', handleBackButtonClick);
    };
  }, []);
Run Code Online (Sandbox Code Playgroud)


Kes*_*era 9

 import { BackHandler } from 'react-native';
  
 constructor() {
        super();           
        this.handleBackButtonClick = this.handleBackButtonClick.bind(this);
 }

   componentWillMount() {
       BackHandler.addEventListener('hardwareBackPress', this.handleBackButtonClick);
   }

   componentWillUnmount() {
       BackHandler.removeEventListener('hardwareBackPress', this.handleBackButtonClick);
   }

   handleBackButtonClick() {
       //this.props.navigation.goBack(null);
       BackHandler.exitApp();
       return true;
   }

   handleBackButtonClick() {
       return true;   // when back button don't need to go back 
   }
Run Code Online (Sandbox Code Playgroud)

在功能组件中

import { BackHandler } from 'react-native';

function handleBackButtonClick() {
    navigation.goBack();
    return true;
  }

  useEffect(() => {
    BackHandler.addEventListener('hardwareBackPress', handleBackButtonClick);
    return () => {
      BackHandler.removeEventListener('hardwareBackPress', handleBackButtonClick);
    };
  }, []);
Run Code Online (Sandbox Code Playgroud)