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
react-native / expo / expo-google-app-auth vs expo-google-sign-in