React Native不会触发React Navigation'beforeRemove'事件

问题描述

我试图阻止用户在React Native中录制视频时通过Android后退按钮或手势返回。根据React Navigation的documentation,应使用beforeRemove事件监听器进行处理。但是返回时永远不会触发该事件。

我尝试使用blur,但是它被触发了,但是由于此事件没有preventDefault()方法,因此在这种情况下不可用。

反应导航-v5.x

React Native-0.63.2

这是我要实现的屏幕的示例代码

const VideoCapturePage = ({navigation}) => {
  const [isRecording,setIsRecording] = useState(false);

  useEffect(() => {
    navigation.addListener('beforeRemove',(e) => {
      if (!isRecording) {
        return;
      }

      e.preventDefault();

      Alert.alert(
        'Unsaved changes','There are unsaved changes. Please chose what you want.',[
          {
            text: 'Go back',onPress: () => {
              navigation.dispatch(e.data.action);
            },},{
            text: 'Cancel',onPress: () => {
              console.log('cancelled');
            },{
            text: 'Continue to Edit',onPress: () => {
              console.log('continue');
            },],{
          cancelable: false,);
    });
  },[navigation,isRecording]);

  return (
    <View style={styles.container}>
      <VideoCamera
        isRecording={isRecording}
        setIsRecording={setIsRecording}
      />
    </View>
  );
};

解决方法

根据您在选项卡/抽屉导航中未使用的文档。您只使用 Modal 和其他区域。 "请注意,此事件仅在移除屏幕时触发。例如:

用户在堆栈中的屏幕上按下后退按钮 用户执行了向后滑动手势 一些动作,如 pop 或 reset 被调度,从状态中移除屏幕 当屏幕未聚焦但未移除时,不会触发此事件。例如:

用户在屏幕顶部推送一个新屏幕,监听器在堆栈中 用户从一个标签/抽屉屏幕导航到另一个标签/抽屉屏幕"

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...