Я столкнулся с этой утомленной проблемой с обработчиком кнопки возврата Android. Предположим, у меня есть 3 экрана, A, B и C. Я использую стековый навигатор. A переходит к B, который переходит к C.
Я хочу иметь возможность вернуться от C к B, но не от B к A. Для этого в B я делаю это:
async componentDidMount() {
if (Platform.OS === "android") {
BackHandler.addEventListener(
"hardwareBackPress",
this.onBackButtonPressAndroid.bind(this)
);
}
}
onBackButtonPressAndroid = () => {
Alert.alert("Backed"); //this is just to test
return true; //make it true to prevent going back
};
А в С:
if (Platform.OS === "android") {
BackHandler.addEventListener(
"hardwareBackPress",
this.onBackButtonPressAndroid.bind(this)
);
}
onBackButtonPressAndroid = () => {
this.props.navigation.goBack(null);
return true;
};
Я удалил прослушиватель событий в componentWillUnmount
.
Когда я иду от А к В и нажимаю кнопку «Назад», он ведет себя правильно: он не возвращается к А, и я вижу предупреждение.
Но потом, когда я иду от Бна C, затем вернитесь к B (используя кнопку «назад»), если я снова нажму кнопку «назад», он вернется к A и не увидит предупреждение.
Почему это происходит?
Обновление Если я не установил обработчик событий в C, то при нажатии кнопки назад я вижу предупреждение! это означает, что обработчики в B вызывают!