Expo Locations.watchPositionAsync 未被删除

Posted

技术标签:

【中文标题】Expo Locations.watchPositionAsync 未被删除【英文标题】:Expo Locations.watchPositionAsync not being removed 【发布时间】:2019-05-03 15:36:56 【问题描述】:

我正在构建一个旅行应用程序。应用程序中的屏幕之一是地图屏幕。我使用 Expo Locations 中的 watchPositionAsync。 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】:

在您的_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;
  ;

【讨论】:

以上是关于Expo Locations.watchPositionAsync 未被删除的主要内容,如果未能解决你的问题,请参考以下文章

Expo大作战(二十三)--expo中expo kit 高级属性(没干货)

Expo SDK 需要 Expo 才能运行。似乎本机 Expo 模块不可用,并且此代码未在 Expo 上运行。我想生成apk

Expo大作战(二十七)--expo sdk api之Util(expo自带工具类),tackSnapshotAsync,Svg,SQLite

Expo大作战(十四)--expo中消息推送的实现

react-native / expo / expo-google-app-auth vs expo-google-sign-in

Expo大作战--expo如何使用Genymotion模拟器