У меня проблема с назначением функции с помощью useState. Насколько я понимаю, глядя на документацию response-native-location: https://github.com/timfpark/react-native-location
Я пытаюсь использовать этот бит из документации:
Subscribe
const unsubscribe = RNLocation.subscribeToLocationUpdates(locations => {
...
})
Unsubscribe
unsubscribe();
Теперь моя проблема в том, что я пытаюсь назначить отписку с помощью хука useState, поэтому я могу вызвать его в своем useEffect, когда логическое значение возвращает false. Поэтому каждый раз, когда я пытаюсь это сделать, кажется, что сам вызов subscribeToLocationUpdates зависает, поэтому я никогда не получаю объекты местоположения, которые должны быть отправлены.
Мой код:
Мой собственный крючок для отслеживания пользователей расположение:
useLocation.js
import {useState, useEffect} from 'react';
import RNLocation from 'react-native-location';
export default (shouldTrack, callback) => {
const [error, setError] = useState('');
const [unsubscribe, setUnsubscribe] = useState(null);
RNLocation.configure({
distanceFilter: 10, // Meters
desiredAccuracy: {
ios: 'bestForNavigation',
android: 'balancedPowerAccuracy',
},
// Android only
androidProvider: 'auto',
interval: 5000, // Milliseconds
fastestInterval: 10000, // Milliseconds
maxWaitTime: 5000, // Milliseconds
// iOS Only
activityType: 'other',
allowsBackgroundLocationUpdates: false,
headingFilter: 1, // Degrees
headingOrientation: 'portrait',
pausesLocationUpdatesAutomatically: false,
showsBackgroundLocationIndicator: false,
});
async function locationFetch() {
await RNLocation.requestPermission({
ios: 'whenInUse',
android: {
detail: 'fine',
rationale: {
title: 'Why do you need my location?',
message: 'Im not creeping',
buttonPositive: 'I understand',
buttonNegative: 'Nope',
},
},
})
.then((granted) => {
if (granted) {
setError('');
const unsub = RNLocation.subscribeToLocationUpdates(callback);
setUnsubscribe(unsub);
} else {
throw new Error('Not Granted Locations Permissions');
}
})
.catch((err) => {
setError(err);
});
}
useEffect(() => {
if (shouldTrack) {
locationFetch();
} else {
unsubscribe();
}
}, [shouldTrack]);
return [error];
};
файл, в котором я использую хук:
import React, {useContext} from 'react';
//import {StyleSheet} from 'react-native';
import {Text} from 'react-native-elements';
import {SafeAreaView, withNavigationFocus} from 'react-navigation';
import Map from '../components/Map';
import {Context as LocationContext} from '../context/LocationContext';
import useLocation from '../hooks/useLocation';
const TrackCreateScreen = ({isFocused}) => {
const {addLocation} = useContext(LocationContext);
const [error] = useLocation(isFocused, addLocation);
return (
<SafeAreaView forceInset={{top: 'always'}}>
<Text h2>Create a Track</Text>
<Map />
{error !== '' ? <Text>Please enable location services</Text> : null}
</SafeAreaView>
);
};
//const styles = StyleSheet.create({});
export default withNavigationFocus(TrackCreateScreen);
Если вы вытащите мой setSubscribe
, он начнет излучать события из звонка, но потом я не могу вызвать метод отказа от подписки.
Любая помощь приветствуется!