Задать вопрос
@AstraVlad
Финансист, консультант, программист-любитель

При размонтировании компонента в React Native стейт уже обнулён?

Пишу небольшое мобильное приложение (никогда этого раньше не делал, поэтому прошу прощения за тупизну), которое должно отслеживать координаты пользователя во время работы. Соответственно, делаю подписку на 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 функция пишется именно для того, чтобы отписаться от всех подписок и т.д. Но получается, что на момент её вызова стейт уже недоступен?
  • Вопрос задан
  • 54 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Grow Media Москва
от 150 000 до 200 000 ₽
Wanted. Санкт-Петербург
До 300 000 ₽
18 дек. 2024, в 11:57
500 руб./в час
18 дек. 2024, в 11:54
2000 руб./за проект