跳至主要内容
版本:6.x

自定义 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添加监听器。这种方法将不起作用 - 在导航生命周期中了解有关此的更多信息。