Flutter使用高德地图获取定位
Github地址:高德定位Flutter插件
具体配置项可查阅官方说明文档
1. 初始化变量
Map<String, Object> _locationResult;
StreamSubscription<Map<String, Object>> _locationListener;
AmapLocationFlutterPlugin _locationPlugin = new AmapLocationFlutterPlugin();
2. 设置API Key并调用定位方法
void initState() {
super.initState();
AmapLocationFlutterPlugin.setApiKey(
'Android Key', 'iOS Key');
_registerListener();
}
3. 定位方法
_registerListener() async {
// 请求系统定位权限
await _handlePermission();
// 配置定位的参数
_setLocationOption();
// 获取定位结果的监听方法
_locationListener = _locationPlugin
.onLocationChanged()
.listen((Map<String, Object> result) {
setState(() {
print(result);
// 将结果存在变量中
_locationResult = result;
});
// 开始定位
// 如果不需要在initState阶段调用定位则不需要这句
_locationPlugin.startLocation();
}
4. 获取权限的方法
Future<void> _handlePermission() async {
// 使用permission_handler: ^5.0.1+1组件获取权限
await Permission.location.request();
}
5. 设置定位参数的方法
void _setLocationOption() {
if (null != _locationPlugin) {
AMapLocationOption locationOption = new AMapLocationOption();
///是否单次定位
locationOption.onceLocation = true;
///是否需要返回逆地理信息
locationOption.needAddress = true;
///逆地理信息的语言类型
locationOption.geoLanguage = GeoLanguage.ZH;
locationOption.desiredLocationAccuracyAuthorizationMode =
AMapLocationAccuracyAuthorizationMode.ReduceAccuracy;
locationOption.fullAccuracyPurposeKey = "AMapLocationScene";
///设置Android端连续定位的定位间隔
locationOption.locationInterval = 2000;
///设置Android端的定位模式<br>
///可选值:<br>
///<li>[AMapLocationMode.Battery_Saving]</li>
///<li>[AMapLocationMode.Device_Sensors]</li>
///<li>[AMapLocationMode.Hight_Accuracy]</li>
locationOption.locationMode = AMapLocationMode.Hight_Accuracy;
///设置iOS端的定位最小更新距离<br>
locationOption.distanceFilter = -1;
///设置iOS端期望的定位精度
/// 可选值:<br>
/// <li>[DesiredAccuracy.Best] 最高精度</li>
/// <li>[DesiredAccuracy.BestForNavigation] 适用于导航场景的高精度 </li>
/// <li>[DesiredAccuracy.NearestTenMeters] 10米 </li>
/// <li>[DesiredAccuracy.Kilometer] 1000米</li>
/// <li>[DesiredAccuracy.ThreeKilometers] 3000米</li>
locationOption.desiredAccuracy = DesiredAccuracy.Best;
///设置iOS端是否允许系统暂停定位
locationOption.pausesLocationUpdatesAutomatically = false;
///将定位参数设置给定位插件
_locationPlugin.setLocationOption(locationOption);
}
}
6. 通过按钮触发定位
RaisedButton(
child: Text('点击定位'),
onPressed: () {
_locationPlugin.startLocation();
}
)
7. 销毁定位
@override
void dispose() {
super.dispose();
// 停止定位
if (null != _locationPlugin) {
_locationPlugin.stopLocation();
}
// 移除定位监听
if (null != _locationListener) {
_locationListener.cancel();
}
// 销毁定位
if (null != _locationPlugin) {
_locationPlugin.destroy();
}
}