Реагируйте на собственное приложение — проведите пальцем вправо, это означает, что все компоненты размонтированы…. можно ли это остановить?

#react-native #react-native-android

Вопрос:

С Android…когда вы проводите пальцем вправо по приложению, оно размонтирует все компоненты и прекратит все операции приложения. Первым размонтируемым компонентом, по-видимому, является родительский набор компонентов (обычно именуемый app.js)…..пожалуйста, поправьте меня, если я ошибаюсь в этом.

Когда это произойдет..Я знаю, что событие componentWillUnmount срабатывает, когда я добавил приведенный ниже код, который регистрируется в консоли.

   componentWillUnmount() {
    console.log('app.js....componentWillUnmount');
  }
 

Мой вопрос в том, могу ли я добавить какой-нибудь дополнительный код, componentWillUnmount который мог Alert бы спросить пользователя: «Вы уверены, что хотите выйти из приложения?»….и дайте им возможность сказать «нет» и сохранить приложение в актуальном состоянии.

Ответ №1:

В BackHandler описании API в официальных документах React-Native приведен пример для того же варианта использования. Вы можете взглянуть на приведенный пример фрагмента кода в официальных документах и выбрать пример с функциональным или классовым компонентом по вашему выбору.

Вы можете разместить этот код в компоненте верхнего уровня, например App.js , или Routes.js .

Другим подходом к тосту с автогидом может быть:

Использование функционального компонента

 import React, {useEffect, useRef} from 'react';
import {Text, SafeAreaView, BackHandler, ToastAndroid} from 'react-native';

export default function App() {
  const doubleBackToExitPressedOnce = useRef(false);

  useEffect(() => {
    const backAction = () => {
      if (doubleBackToExitPressedOnce.current) {
        BackHandler.exitApp();
        return true;
      }

      ToastAndroid.show('Press back again to exit', ToastAndroid.SHORT);
      doubleBackToExitPressedOnce.current = true;
      setTimeout(() => {
        doubleBackToExitPressedOnce.current = false;
      }, 2000);
      return true;
    };

    const backHandler = BackHandler.addEventListener(
      'hardwareBackPress',
      backAction,
    );

    return () => backHandler.remove();
  }, []);

  return (
    <SafeAreaView>
      <Text>Hello world!</Text>
    </SafeAreaView>
  );
}
 

Использование компонента класса:

 import React, {Component} from 'react';
import {SafeAreaView, Text, BackHandler, ToastAndroid} from 'react-native';

export default class App extends Component {
  backAction = () => {
    if (this.doubleBackToExitPressedOnce) {
      BackHandler.exitApp();
    }
    ToastAndroid.show('Press back again to exit', ToastAndroid.SHORT);
    this.doubleBackToExitPressedOnce = true;
    setTimeout(() => {
      this.doubleBackToExitPressedOnce = false;
    }, 2000);
    return true;
  };

  componentDidMount() {
    this.doubleBackToExitPressedOnce = false;
    this.backHandler = BackHandler.addEventListener(
      'hardwareBackPress',
      this.backAction,
    );
  }

  componentWillUnmount() {
    this.backHandler.remove();
  }

  render() {
    return (
      <SafeAreaView>
        <Text>Hello world!</Text>
      </SafeAreaView>
    );
  }
}