Проблема с настройкой отказа от подписки от response-native-location к переменной состояния - PullRequest
1 голос
/ 04 августа 2020

У меня проблема с назначением функции с помощью 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, он начнет излучать события из звонка, но потом я не могу вызвать метод отказа от подписки.

Любая помощь приветствуется!

...