2016-03-30 2 views
1

У меня есть приложение React Native, которое находится на 0,18, и я пытаюсь реализовать функциональность кнопки «Назад» для Android. У меня есть следующий код в моем index.android.js:BackAndroid hardwareBackPress прослушиватель перестает работать после возвращения на начальный маршрут

let navigator; 

BackAndroid.addEventListener('hardwareBackPress',() => { 
    if (navigator && navigator.getCurrentRoutes().length > 1) { 
    navigator.pop(); 
    return true; 
    } 
    return false; 
}); 

И в моей визуализации:

<Navigator 
    ref={(nav) => { navigator = nav; }} 
    ... 

Кнопка назад работает, если я иду вперед любое количество маршрутов, а затем я могу вернуться любое количество маршруты к первоначальному маршруту. Однако, вернувшись к первоначальному маршруту, кнопка «Назад» перестает работать до тех пор, пока я не перезагружу JS или не перезапустил приложение.

Неужели кто-то еще столкнулся с этим и какое решение?

Редактировать: Я тестировал 0,21, 0,22 и 0,23-rc3 и все еще имею эту проблему в последней версии.

+0

У меня очень похожая часть кода, и с этим кодом кнопка возврата выходит из всего приложения, когда на начальном маршруте. Это была цель, не так ли? – zvona

+0

Несколько. Если я запустил приложение, то сразу же нажмите кнопку «Назад», он выйдет из приложения. Однако, если я запустил приложение, перейдите на любой маршрут, затем нажмите кнопку «Назад», нажатие кнопки «Назад» снова не выйдет из приложения, и если я снова перейду на другой маршрут, нажатие кнопки «Назад» не приведет меня обратно к первому маршруту, как он должен. – NeuroXc

+0

По существу, слушатель перестает слушать, когда я возвращаюсь к первоначальному маршруту. Если я поставлю console.log в обработчике, он не будет запущен после щелчка назад после перехода обратно к исходному маршруту. – NeuroXc

ответ

0

Похоже, проблема заключалась в том, что в других компонентах приложения мы добавили обработчики событий для обработки изменяющихся макетов при открытии клавиатуры, а при размонтировании этих компонентов мы вызывали DeviceEventEmitter.removeAllListeners(). В отличие от интуиции, этот вызов удаляет всех слушателей по всему миру, независимо от компонента-экземпляра, и применяется даже к слушателям, созданным по адресу BackAndroid, а не по DeviceEventEmitter. Итак, вернувшись из компонента с клавиатурным макетом, слушатель hardwareBackPress также был удален, а кнопка «Назад» перестала работать.

Выполнение removeAllListeners звонков более конкретно, например. DeviceEventEmitter.removeAllListeners('keyboardWillShow'); разрешил эту проблему.

+0

У меня такая же проблема, как и у OP, но я не использую 'DeviceEventEmitter.removeAllListeners()' в моем коде. Что еще может вызвать такое поведение? – Romy

Смежные вопросы