在导航器的每个屏幕上触发 BackHandler 的 HardwareBackPress 事件
BackHandler's HardwareBackPress event gets triggered on every screen of the navigator
我在我的应用程序的“主”屏幕上使用 BackHandler
来提醒用户确认退出应用程序。我的根导航器上有 2 组屏幕身份验证和主页,isLogged
bool 确定显示哪一组。
问题:应用程序的第一次渲染工作正常(无论是 Auth 还是 Home 屏幕集)但是当 isLogged
更改并且屏幕集更改时,BackHandler
开始在每个屏幕上触发更改设置的屏幕。这只有在重新启动应用程序后才能解决。工作示例 - https://snack.expo.dev/@msaxena92/11fd51
预期结果:在导航器内按返回键应该会带您到导航器的 initialRoute
或第一个屏幕,只有在那之后导航堆栈中没有更多屏幕时才会退出应用程序。
您有 2 个选择:
使用 useFocusEffect
挂钩而不是 useEffect
,这将确保仅当您在此屏幕上时才 运行 效果:
useFocusEffect(
React.useCallback(() => {
const backAction = () => {
Alert.alert("Hold on!", "Are you sure you want to exit?", [
{ text: "Cancel" },
{ text: "Yes", onPress: () => BackHandler.exitApp() }
]);
return true;
};
const backHandler = BackHandler.addEventListener(
"hardwareBackPress",
backAction
);
return () => backHandler.remove();
}, [])
);
或者,您也可以检查效果内的焦点:
React.useEffect(() => {
const backAction = () => {
if (!navigation.isFocused()) {
return false;
}
Alert.alert("Hold on!", "Are you sure you want to exit?", [
{ text: "Cancel" },
{ text: "Yes", onPress: () => BackHandler.exitApp() }
]);
return true;
};
const backHandler = BackHandler.addEventListener(
"hardwareBackPress",
backAction
);
return () => backHandler.remove();
}, [navigation]);
另见 https://reactnavigation.org/docs/custom-android-back-button-handling/
我在我的应用程序的“主”屏幕上使用 BackHandler
来提醒用户确认退出应用程序。我的根导航器上有 2 组屏幕身份验证和主页,isLogged
bool 确定显示哪一组。
问题:应用程序的第一次渲染工作正常(无论是 Auth 还是 Home 屏幕集)但是当 isLogged
更改并且屏幕集更改时,BackHandler
开始在每个屏幕上触发更改设置的屏幕。这只有在重新启动应用程序后才能解决。工作示例 - https://snack.expo.dev/@msaxena92/11fd51
预期结果:在导航器内按返回键应该会带您到导航器的 initialRoute
或第一个屏幕,只有在那之后导航堆栈中没有更多屏幕时才会退出应用程序。
您有 2 个选择:
使用 useFocusEffect
挂钩而不是 useEffect
,这将确保仅当您在此屏幕上时才 运行 效果:
useFocusEffect(
React.useCallback(() => {
const backAction = () => {
Alert.alert("Hold on!", "Are you sure you want to exit?", [
{ text: "Cancel" },
{ text: "Yes", onPress: () => BackHandler.exitApp() }
]);
return true;
};
const backHandler = BackHandler.addEventListener(
"hardwareBackPress",
backAction
);
return () => backHandler.remove();
}, [])
);
或者,您也可以检查效果内的焦点:
React.useEffect(() => {
const backAction = () => {
if (!navigation.isFocused()) {
return false;
}
Alert.alert("Hold on!", "Are you sure you want to exit?", [
{ text: "Cancel" },
{ text: "Yes", onPress: () => BackHandler.exitApp() }
]);
return true;
};
const backHandler = BackHandler.addEventListener(
"hardwareBackPress",
backAction
);
return () => backHandler.remove();
}, [navigation]);
另见 https://reactnavigation.org/docs/custom-android-back-button-handling/