Как Back Pressed работает в React Native:
Чтобы Back Pressed работал в react native, нам нужно соблюдать некоторые соглашения. Поскольку RN - это гибридное приложение, мы не можем напрямую реализовать эту возможность Android. Итак, нам просто нужно выполнить некоторые шаги и соглашения, которые позволят нам получить возможности Android.
Шаг 1. Сначала нам нужно импортировать модуль BackHandler из библиотеки react-native. Этот модуль позволит RN взаимодействовать с основным оборудованием Android.
import {BackHandler} from “react-native”;
Шаг 2: Затем нам нужно определить метод / функцию обратного обработчика, в которой мы будем писать действие события Back Pressed.
handleBackButton(){ }
Шаг 3: Теперь нам нужно добавить и привязать эту функцию к нашему модулю BackHandler в методе componentDidMount во время загрузки компонента, для этого нам нужно использовать addEventListener модуля BackHandler и добавьте метод handleBackButton в BackHandler и свяжите его с областью действия этого класса.
BackHandler.addEventListener(‘hardwareBackPress’,this.handleBackButton.bind(this));
Шаг 4: Теперь мы готовы заставить работать свой handleBackButton. Итак, чтобы выйти, нажмите кнопку «Назад» на вашем устройстве Android. Нам нужно написать
BackHandler.exitApp();
Полный код
import React, {Component} from 'react'; import {Actions, Router, Scene} from "react-native-router-flux"; import Login from "./src/login"; import {BackHandler} from "react-native"; export default class App extends Component<Props> { componentDidMount() { BackHandler.addEventListener('hardwareBackPress', this.handleBackButton.bind(this)); } handleBackButton(){ BackHandler.exitApp(); } render() { return ( <Router> <Scene key='root'> <Scene key="login" hideNavBar component={Login} /> </Scene> </Router> ); } }
Шаг 5. Теперь мы можем сделать его немного умнее. Если этот код работает для вас, вы можете попробовать следующее. Итак, теперь мы сделаем наш onbackPressExit на 1 шаг впереди. Поскольку мы используем react-native-router-flux, это означает, что мы используем Router и Scene. Итак, у нас есть несколько сцен. Поэтому, если пользователь вернется на любой экран, приложение выйдет. Так что, если мы хотим выйти в определенной Сцене. Поэтому для этого мы должны условно выполнить команду BackHandler.exitApp (). Вот код, в конце кода я объясню, что происходит.
Полностью измененный код
import React, {Component} from 'react'; import {Actions, Router, Scene} from "react-native-router-flux"; import Login from "./src/login"; import Login2 from "./src/dashboard"; import MoreScreen from './src/MoreScreen'; import {BackHandler, ToastAndroid} from "react-native"; import Campaigns from "./src/campaign"; import Agents from './src/agents'; let backPressed = 0; export default class App extends Component<Props> { componentDidMount() { BackHandler.addEventListener('hardwareBackPress', this.handleBackButton.bind(this)); } constructor(){ super(); this.state={ isloggedin: false, backPressed: 1 } } handleBackButton(){ if(Actions.currentScene === 'campaigns' || Actions.currentScene === 'agents' || Actions.currentScene === 'dashboard'){ if(backPressed > 0){ BackHandler.exitApp(); backPressed = 0; }else { backPressed++; ToastAndroid.show("Press Again To Exit", ToastAndroid.SHORT); setTimeout( () => { backPressed = 0}, 2000); return true; } } } render() { return ( <Router> <Scene key='root'> <Scene key="login" hideNavBar component={Login} /> <Scene key='dashboard' hideNavBar component={Login2} title={'Dashboard'} /> <Scene key='MoreScreen' hideNavBar component={MoreScreen} title={'MoreScreen'} /> <Scene key='campaigns' hideNavBar component={Campaigns} title={'campaigns'} /> <Scene key='agents' hideNavBar component={Agents} title={'agents'} /> </Scene> </Router> ); } }
Здесь, в рендере, у нас есть функция возврата под функцией возврата, у нас есть компонент Route, а в разделе Route у нас есть корневая сцена, под сценой маршрута у нас есть 5 сцен. Эти пять сцен
<Scene key="login" hideNavBar component={Login} /> <Scene key='dashboard' hideNavBar component={Login2} title={'Dashboard'} /> <Scene key='MoreScreen' hideNavBar component={MoreScreen} title={'MoreScreen'} /> <Scene key='campaigns' hideNavBar component={Campaigns} title={'campaigns'} /> <Scene key='agents' hideNavBar component={Agents} title={'agents'} />
Теперь, если мы хотим, чтобы это происходило только в том случае, если пользователь находится в Личном кабинете, Агентах или Кампании, тогда кнопка Back Press выйдет из приложения. Поэтому для повышения производительности нам необходимо обновить метод handleBackButton следующим образом.
handleBackButton(){ if(Actions.currentScene === 'campaigns' || Actions.currentScene === 'agents' || Actions.currentScene === 'dashboard'){ if(backPressed > 0){ BackHandler.exitApp(); backPressed = 0; }else { backPressed++; ToastAndroid.show("Press Again To Exit", ToastAndroid.SHORT); setTimeout( () => { backPressed = 0}, 2000); return true; } } }
Здесь мы также сделали еще одно - снова нажали тост. Таким образом, если пользователь находится в желаемой Сцене и нажимает кнопку «Назад», то появляется всплывающее сообщение, в котором пользователю будет предложено еще раз нажать кнопку «Назад» для выхода. Чтобы добиться этого, мы использовали модуль ToastAndroid из react-native. Мы также объявляем переменную с именем backPressed вверху как глобальную переменную со знаком 0.
let backPressed = 0;
Эта переменная используется для отслеживания того, сколько раз пользователь нажимал кнопку возврата. поэтому в методе handleBackButton мы проверили, находится ли пользователь в правильной сцене по условию
if(Actions.currentScene === 'campaigns' || Actions.currentScene === 'agents' || Actions.currentScene === 'dashboard')
а затем мы проверили, сколько раз нажималась кнопка.
if(backPressed > 0)
Если это больше, чем 1 раз, то будет выполнена истинная часть тела IF, и приложение завершится.
{ BackHandler.exitApp(); backPressed = 0; }
но если это первый раз, когда кнопка «Назад» нажата, то значение переменной backPressed будет увеличено, и будет показан тост.
backPressed++; ToastAndroid.show("Press Again To Exit", ToastAndroid.SHORT);
Затем я также переместил функциональность немного дальше. Итак, чтобы устранить ошибку (если вы нажмете кнопку один раз и перейдете к другой Сцене, а затем снова нажмете кнопку «Назад», она выйдет. Не отображается всплывающее сообщение о том, что «нажмите еще раз, чтобы выйти»).
чтобы решить эту проблему, мы использовали функцию setTimeout, где ждали 2 секунды. в течение этих 2 секунд, если вторая нажатая кнопка назад не нажата, тогда переменная backPressed будет сброшена на 0, чтобы пользователь перешел на другую сцену и снова нажал обратно, затем он снова показывает тост и возвращает истину, чтобы он не выполнял значение по умолчанию обратное мероприятие для прессы.
setTimeout( () => { backPressed = 0}, 2000); return true;
Таким образом, приложение будет закрыто только в том случае, если пользователь находится на панели инструментов, в агентах или в сцене кампании. В противном случае кнопка возврата назад будет работать по умолчанию.