Выход из приложения на спине нажмите на Android в реагировать родной? - PullRequest
2 голосов
/ 18 марта 2019

на Android Mi Note 3, аппаратная кнопка «назад» не запускает handleBackPress, когда я нажимаю на кнопку «Назад» при выходе из приложения.

У меня есть следующий код, но handleBackPress не вызывается,

 componentDidMount() {
    BackHandler.addEventListener('hardwareBackPress', this.handleBackPress);
  }

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

  handleBackPress = () => {
    this.goBack(); // works best when the goBack is async
    return true;
  }

Навигационный код:

const ModalSignUp = createStackNavigator(
  {
    Signup: { screen: Signup, key: 'Signup' },
    PartyList: { screen: PartyList, key: 'PartyList' },
    StatesList: { screen: StatesList, key: 'StatesList' },

  },
  {
    initialRouteName: 'Signup',
    headerMode: 'none',
    mode: 'card',
  }
);

Навигация:

this.props.navigation.push("StatesList")

Ожидается:

назад нажмите аппаратную кнопку, перейдите на предыдущий экран.

Заранее спасибо.

Ответы [ 5 ]

1 голос
/ 18 марта 2019

Ваша ошибка может быть способом, которым вы получаете следующий вид react-natigation.

Вам необходимо использовать .push для создания нового представления в стеке, и когда вы нажмете кнопку «Назад», будет запущен .goBack().

По умолчанию кнопка «Назад» всегда выполняет навигацию, чтобы вернуться в стек, но если у вас есть только один вид в стеке (это происходит, когда вы используете только .navigate), приложение закроется.

Не уверен, как вы перемещаетесь по представлениям, но это может быть решением.

Редактировать: Для решения этой проблемы при навигации по представлениям использовать navigation.push('viewname') вместо navigation.navigate('viewname'). Вам не нужен какой-либо другой метод (например, тот, который вы задали в вопросе).

Также проверьте документы , чтобы понять, как работает навигация или этот вопрос

0 голосов
/ 18 марта 2019

1.Импорт

import { BackHandler, DeviceEventEmitter } from 'react-native'

2.конструктор

constructor(props) {
    super(props)
    this.backPressSubscriptions = new Set()
  }

3.Добавить и удалить слушателей

componentDidMount() {
    DeviceEventEmitter.removeAllListeners('hardwareBackPress')
    DeviceEventEmitter.addListener('hardwareBackPress', () => {
        let invokeDefault = true
        const subscriptions = []

        this.backPressSubscriptions.forEach(sub => subscriptions.push(sub))

        for (let i = 0; i < subscriptions.reverse().length; i += 1) {
            if (subscriptions[i]()) {
                invokeDefault = false
                break
            }
        }

        if (invokeDefault) {
            BackHandler.exitApp()
        }
    })

    this.backPressSubscriptions.add(this.handleHardwareBack)
}

componentWillUnmount() {
    DeviceEventEmitter.removeAllListeners('hardwareBackPress')
    this.backPressSubscriptions.clear()
}

4.Ручка назад

handleHardwareBack = () => {
    this.props.navigation.goBack(null)
    console.log(" ********** This is called ************ ");
    return true;
}
0 голосов
/ 18 марта 2019

Дайте ему попытку ... это работает для меня: в componentWillUnmount

BackHandler.removeEventListener('hardwareBackPress', () => {});

Кроме того, убедитесь, что в каждом случае вы проверяете в своем this.goBack(); это return что-то

goback = () => {
   if (condition2) 
     // handling
    return something;

  if (condition2)
   // handling
   return something;

  // default:
  return true;
};
0 голосов
/ 18 марта 2019

Попробуйте использовать return false вместо return true.

0 голосов
/ 18 марта 2019

Попробуйте это:

import {BackHandler} from 'react-native';

export default class Component extends Component {
     _didFocusSubscription;
     _willBlurSubscription;
     constructor(props) {
         super(props);
         this._didFocusSubscription = props.navigation.addListener('didFocus',payload =>
            BackHandler.addEventListener('hardwareBackPress', this.onBackButtonPressAndroid)
         ); 
     }
  }
componentDidMount() {
        this._willBlurSubscription = this.props.navigation.addListener('willBlur', payload =>
            BackHandler.removeEventListener('hardwareBackPress', this.onBackButtonPressAndroid)
        );
 }
componentWillUnmount() {
        this._didFocusSubscription && this._didFocusSubscription.remove();
        this._willBlurSubscription && this._willBlurSubscription.remove();
    }
onBackButtonPressAndroid = () => {
    //code when you press the back button
 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...