Пишу небольшое мобильное приложение (никогда этого раньше не делал, поэтому прошу прощения за тупизну), которое должно отслеживать координаты пользователя во время работы. Соответственно, делаю подписку на watchPositionAsync и хочу отписаться при выходе с экрана. Код примерно такой (почти везде заглушки console.log чтобы понять что происходит):
function SurveyScreen({ route, navigation }) {
...
const [passengers, setPassengers] = useState(0)
const [location, setLocation] = useState(null)
...
const locCallback = (locationObject) => {
console.log(locationObject.coords)
}
useEffect(() => {
if (locSub == null) {
(async () => {
setLocSub(await Location.watchPositionAsync({ accuracy: Location.Accuracy.Highest, timeInterval: 5000 }, locCallback))
})()
}
return () => {
console.log(`!! ${locSub}`)
if (locSub !== null) {
console.log(`locSub is: ${locSub}`)
console.log(`locSub.remove is: ${locSub.remove}`)
locSub.remove()
}
}
}, [])
useEffect(() => {
...
console.log(locSub)
...
}
}, [passengers])
...
Подписка идёт нормально, координаты в locCallback идут, но когда компонент размонтируется (ухожу через navigation), то locSub уже null. В консоли это выглядит так:
Object {
"remove": [Function remove],
}
Object {
"remove": [Function remove],
}
Object {
"remove": [Function remove],
}
Object {
"remove": [Function remove],
}
!! null
Пока компонент активен, основной UseEffect прекрасно видит сохраненный locSub, но на этапе очистки он уже null. В чем может быть проблема? Во всех мануалах читал, что cleanup функция пишется именно для того, чтобы отписаться от всех подписок и т.д. Но получается, что на момент её вызова стейт уже недоступен?