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

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

Войти через центр авторизации
Похожие вопросы