Error: llamada de gancho no válida. Los ganchos solo se pueden llamar dentro del cuerpo de un componente de función. Esto podría suceder por una de las siguientes razones:
Estoy tratando de implementar el permiso de ubicación en reaccionar nativo (estoy usando expo CLI)
esta es la función que ya creé:
function OfferScreen({ navigation}: {navigation:any}) { //STATE VARIABLES FOR FETCHING DATA const [loading, setLoading] = useState(true); const [data, setData] = useState([]); const value = new Animated.Value(1); //FETCHING DATA React.useEffect(() => { fetch("https://fidness.net/WSExchange/getListActiveProspectus") .then((response) => response.json()) .then((json) => { setData(json); setLoading(false); }) .catch((error) => { alert( "Erreur avec le chargement des offres, veuillez réssayer ultérieurement!" ); setLoading(false); }); //GEOLOCATION TEST //STATE FOR GEOLOCATION const [location, setLocation] = useState < any | null > (null); const [hasPermission, setHasPermission] = useState < any | null > (null); useEffect(() => { (async () => { const {status} = await Location.requestForegroundPermissionsAsync(); setHasPermission(status === "granted"); let location = await Location.getCurrentPositionAsync({}); })(); }, []); } export default OfferScreen;y esta es la función de destino en mi barra de pestañas
<Tab.Screen //TABSCREEN OFFER options={ {headerShown: false} } name={"Offres"} component={Offers}/>y por cierto cuando elimino el código de permiso de ubicación funciona bien.
No puede tener useState() dentro de un React.useEffect() . Mueva estas declaraciones a la parte superior y fuera de useEffect
function OfferScreen({ navigation }: { navigation: any }) { //STATE VARIABLES FOR FETCHING DATA const [loading, setLoading] = useState(true); const [data, setData] = useState([]); const value = new Animated.Value(1); //GEOLOCATION TEST //STATE FOR GEOLOCATION const [location, setLocation] = (useState < any) | (null > null); const [hasPermission, setHasPermission] = (useState < any) | (null > null); React.useEffect(() => { if (!loading && data) { (async () => { const { status } = await Location.requestForegroundPermissionsAsync(); setHasPermission(status === "granted"); let location = await Location.getCurrentPositionAsync({}); })(); } }, [data, loading]); //FETCHING DATA React.useEffect(() => { fetch("https://fidness.net/WSExchange/getListActiveProspectus") .then((response) => response.json()) .then((json) => { setData(json); setLoading(false); }) .catch((error) => { alert( "Erreur avec le chargement des offres, veuillez réssayer ultérieurement!" ); setLoading(false); }); }, []); } export default OfferScreen;