Expo Locations.watchPositionAsync не удаляется - PullRequest
0 голосов
/ 03 мая 2019

Я создаю приложение для путешествий.Одним из экранов в приложении является экран карты.Я использую watchPositionAsync из Expo Locations.watchPositionAsync прекрасно работает и передает пользовательские координаты.Я хочу, чтобы watchPositionAsync был остановлен / удален после закрытия экрана карты / модального окна.Я добавляю функцию .remove () к watchPositionAsync, но, к сожалению, watchPositionAsync продолжает работать.Как заставить его перестать работать после закрытия модала?

Я пытался использовать .remove () различными способами: - componentWillUnmount и т. Д. - Я даже пытался выполнить его в кнопке(onPress)

async componentWillMount() {

    const { status } = await Permissions.askAsync(Permissions.LOCATION);

    if (status === 'granted') {
      this._getLocationAsync();
    } else {
      this.setState({ error: 'Locations services needed' });
    }
  }

  componentWillUnmount() {
      this._stopGetLocationAsync().catch(err => console.log('err'));
  }

  _getLocationAsync = async () => {
      const location = await Location.watchPositionAsync(
          {
              enableHighAccuracy: true,
              distanceInterval: 1,
              timeInterval: 10000
          },
          newLocation => {
              let coords = newLocation.coords;
          // this.props.getMyLocation sets my reducer state my_location
          this.props.getMyLocation({
              latitude: parseFloat(coords.latitude),
              longitude: parseFloat(coords.longitude)
          });
        },
        error => console.log(error)
      );
      return location;
  };

  _stopGetLocationAsync = async () => {
    const location = await Location.watchPositionAsync();
    return location.remove();
  };

Я ожидаю, что watchPositionAsync будет удален после размонтирования компонента, но когда я console.log (location.remove ()), я получаю неопределенное значение.

1 Ответ

0 голосов
/ 08 июля 2019

В вашем _stopGetLocationAsync вы создаете новый объект обещания watchPositionAsync и удаляете его. Поэтому оригинал в _getPositionASync все еще там.

Вам нужно изменить const Location на переменную класса, i.e. this.location=..., а затем передать метод remove этой переменной.

вот модифицированный код

async componentWillMount() {

    const { status } = await Permissions.askAsync(Permissions.LOCATION);

    if (status === 'granted') {
      this._getLocationAsync();
    } else {
      this.setState({ error: 'Locations services needed' });
    }
  }

  componentWillUnmount() {
     this.location.remove(callback...);
  }

  _getLocationAsync = async () => {
      this.location = await Location.watchPositionAsync(
          {
              enableHighAccuracy: true,
              distanceInterval: 1,
              timeInterval: 10000
          },
          newLocation => {
              let coords = newLocation.coords;
          // this.props.getMyLocation sets my reducer state my_location
          this.props.getMyLocation({
              latitude: parseFloat(coords.latitude),
              longitude: parseFloat(coords.longitude)
          });
        },
        error => console.log(error)
      );
      return location;
  };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...