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 variablethis.backHandler
para poder eliminarlo correctamente encomponentWillUnmount
. 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 quecomponentWillUnmount
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
ycomponentWillUnmount
.Respondida el Dec 19, 2020 a las 09:09 - por Gemini
Votos positivos: 0 | Votos negativos: 0