自定义 Android 返回按钮行为
默认情况下,当用户按下 Android 硬件返回按钮时,react-navigation 会弹出屏幕或退出应用程序(如果没有任何屏幕可以弹出)。这是一个合理的默认行为,但有些情况下您可能想要实现自定义处理。
例如,考虑一个用户在列表中选择项目的屏幕,并且“选择模式”处于活动状态。在按下返回按钮时,您首先需要停用“选择模式”,并且只有在第二次按下返回按钮时才弹出屏幕。以下代码片段演示了这种情况。我们使用 BackHandler
(随 react-native 提供),以及 useFocusEffect
钩子来添加我们自定义的 hardwareBackPress
监听器。
从 onBackPress
返回 true
表示我们已处理该事件,并且 react-navigation 的监听器不会被调用,因此不会弹出屏幕。返回 false
将导致事件冒泡,并且 react-navigation 的监听器将弹出屏幕。
function ScreenWithCustomBackBehavior() {
// ...
useFocusEffect(
React.useCallback(() => {
const onBackPress = () => {
if (isSelectionModeEnabled()) {
disableSelectionMode();
return true;
} else {
return false;
}
};
const subscription = BackHandler.addEventListener(
'hardwareBackPress',
onBackPress
);
return () => subscription.remove();
}, [isSelectionModeEnabled, disableSelectionMode])
);
// ...
}
所提出的方法适用于在 StackNavigator
中显示的屏幕。目前可能不支持其他情况下的自定义返回按钮处理(例如,已知无法使用此方法的情况是,您想要处理打开抽屉中的返回按钮按下操作。欢迎为这类用例提交 PR!)。
如果您不想覆盖系统后退按钮,而是想阻止从屏幕返回,请参阅有关阻止返回的文档。
为什么不使用组件生命周期方法
首先,您可能倾向于使用componentDidMount
订阅后退按下事件,并使用componentWillUnmount
取消订阅,或者使用useEffect
添加监听器。这种方法将不起作用 - 在导航生命周期中了解有关此的更多信息。