我们在这里说的获取位置信息本质上是获取当前手机所在位置的gps坐标,就是我们常说的经纬度。获取位置信息属于原生平台提供的功能,Flutter做为UI框架并没有提供这种功能,因此我们需要自己编写channel
,然后分别在Android和IOS平台上实现相关的代码,这样做显然又回到了原生开发中,好在Flutter提供了包机制,而且已经有三方包替我们做了这件事情,我们只需要在项目中引入并且使用三方包就可以获取到位置信息,该包的名称为:geolocator
.本章回中将详细介绍它的使用方法。
这些使用方法还有一些注意事项需要和大家说明,以免大家在使用时出现错误:
此外,该包还提供了监听位置开关和监听位置信息的功能,它会把位置开关状态,和位置服务封装到stream
中,我们获取到相应的stream后就可以使用listen
()方法来监听位置开关的变化和位置信息的变化。
///获取位置开关状态,如果没有打开开关就跳转到开关设置页面(仅支持android)
locationServiceEnabled = await Geolocator.isLocationServiceEnabled();
if(!locationServiceEnabled) {
debugPrint('location service is disabled');
///打开位置形状只适用于android,IOS不可以
Geolocator.openLocationSettings();
return Future.error('Location service is disabled');
}
///检查位置权限
permission = await Geolocator.checkPermission();
if(permission == LocationPermission.denied || permission == LocationPermission.deniedForever) {
permission = await Geolocator.requestPermission();
if(permission == LocationPermission.always || permission == LocationPermission.whileInUse) {
positionResult = await Geolocator.getCurrentPosition();
}else {
debugPrint('Location permission is denied');
return Future.error('Location permission is denied');
}
}else {
///获取最近一次的位置信息和当前位置信息
positionResult = await Geolocator.getLastKnownPosition();
positionResult ??= await Geolocator.getCurrentPosition();
}
///通过stream监听位置信息
StreamSubscription<Position> serviceStatus = Geolocator.getPositionStream(
locationSettings: locationSettings,).listen(
(event) { debugPrint('geo updated: ${event.toString()}');},
onDone: () => debugPrint('service updated done'),
onError: (error) => debugPrint('service updated error: ${error.toString()}'),
);
上面的代码中添加了注释,这样方便大家理解代码。在使用的时候最好把这些方法封装成独立的方法,因为需要使用aync/await
关键字。我在这里就不演示程序的运行结果了,建议大家自己动手去实践,通过日志打印出获取到的位置信息。
这个包的功能十分强大,除了可以提供位置信息外,还实现了位置信息的外围功能,比如检查位置权限,申请位置权限,打开位置开关。这些功能十分实用,可以极大地提高我们的开发效率。
这个包还提供了监听位置开关状态和位置信息服务的功能,监听通过stream
机制实现,这个功能是我最喜欢的功能。
总之,这个包的功能十分强大,使用检验非常好,我推荐大家去亲自去检验一下。关于这个包的缺点,我感觉会在Android兼容性上出问题.因为Android的位置权限分前台和后面,而且还有粗略和精确之分,这些差异分散在不同的Android版本中,包中文档没有提到这些,当然也有可能该包已经兼容了各个Android版本。我没有在多个Android平台上验证,感兴趣的看官们可以自己去验证。
看官们,与"如何获取位置信息"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!