Reaccionar acción nativa BackHandler se guarda en la siguiente página

Usé BackHandler para configurar el botón de vuelta en android, este es mi código:

  componentDidMount = async () => {
    BackHandler.addEventListener("hardwareBackPress", this.backAction);
  }

  backAction = () => {
    this.props.resetPage("Home");
    return true;
  };

  componentWillUnmount = () => {
    BackHandler.removeEventListener("hardwareBackPress", this.backAction);
  }

Pero en la siguiente página, si no confío a Backhandler, presiono hacia atrás, fue this.props.resetPage("Home"), además de cómo configurarlo, ¿hay una manera de destruirlo? Gracias.

Pregunta hecha hace 3 años, 4 meses, 27 días - Por byteninja8245


2 Respuestas:

  • El problema que estás experimentando se debe a que la acción de la página anterior se está ejecutando también en la siguiente página cuando se presiona el botón de retroceso en Android. Para evitar que esto suceda, puedes asegurarte de que el evento de BackHandler esté configurado correctamente y se elimine adecuadamente al pasar a la siguiente página.

    Una forma de solucionar esto es modificando tu código de la siguiente manera:

    javascript
    componentDidMount = async () => {
      this.backHandler = BackHandler.addEventListener("hardwareBackPress", this.backAction);
    }
    
    backAction = () => {
      this.props.resetPage("Home");
      return true;
    };
    
    componentWillUnmount = () => {
      this.backHandler.remove();
    }
    

    Con esta modificación, ahora almacenamos el objeto retornado por BackHandler.addEventListener en una variable this.backHandler para poder eliminarlo correctamente en componentWillUnmount. De esta manera, cuando la página se desmonte, el evento de BackHandler se eliminará correctamente y ya no se ejecutará la acción no deseada en la siguiente página. ¡Espero que esta solución te ayude a resolver tu problema!

    Respondida el Dec 19, 2020 a las 09:02 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema es que estás eliminando el listener en componentWillUnmount, pero el componente aún puede estar montado en ese momento. React Native no garantiza que componentWillUnmount se llame inmediatamente después de que el componente se desmonte.

    Para resolver este problema, debes eliminar el listener en componentDidUnmount, que se garantiza que se llamará después de que el componente se haya desmontado.

    Aquí tienes el código corregido:

    
    componentDidMount = async () => {
      BackHandler.addEventListener("hardwareBackPress", this.backAction);
    };
    
    backAction = () => {
      this.props.resetPage("Home");
      return true;
    };
    
    componentDidUnmount = () => {
      BackHandler.removeEventListener("hardwareBackPress", this.backAction);
    };
    

    También puedes usar el hook useEffect para agregar y eliminar el listener. Aquí tienes cómo hacerlo:

    
    useEffect(() => {
      const backAction = () => {
        props.resetPage("Home");
        return true;
      };
    
      BackHandler.addEventListener("hardwareBackPress", backAction);
    
      return () => {
        BackHandler.removeEventListener("hardwareBackPress", backAction);
      };
    }, []);
    

    Este enfoque es equivalente al uso de componentDidMount y componentWillUnmount.

    Respondida el Dec 19, 2020 a las 09:09 - por Gemini

    Votos positivos: 0 | Votos negativos: 0