-
最近Flutter开发需要用到定位,使用高德定位(amap_flutter_location)。
在pubspec.yaml 文件配置
dependencies: amap_flutter_location: ^2.0.0
-
Android、Ios 申请高德地图key(这里不做多说,按照高德官方配置就行)
集成高德定位Flutter插件-定位Flutter插件-开发指南-Flutter插件 | 高德地图API
-
注意点,Android 还需要在 build.gradle 文件添加
dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation('com.amap.api:location:5.2.0') }
-
结合permission_handler 单例封装(location_utils)
import 'dart:async'; import 'package:amap_flutter_location/amap_flutter_location.dart'; import 'package:amap_flutter_location/amap_location_option.dart'; import 'package:permission_handler/permission_handler.dart'; class LocationUtils { LocationUtils._internal() {} static LocationUtils _locationUtils = LocationUtils._internal(); Map<String, Object> _locationResult; StreamSubscription<Map<String, Object>> _locationListener; AMapFlutterLocation _locationPlugin = new AMapFlutterLocation(); factory LocationUtils() { return _locationUtils; } ///初始化 void init() { AMapFlutterLocation.setApiKey("androidkey", "ioskey"); ///注册定位结果监听 _locationListener = _locationPlugin.onLocationChanged().listen((Map<String, Object> result) { _locationResult = result; }); } /// 动态申请定位权限 void requestPermission() async { // 申请权限 bool hasLocationPermission = await requestLocationPermission(); if (hasLocationPermission) { _startLocation(); } else { } } /// 申请定位权限 /// 授予定位权限返回true, 否则返回false Future<bool> requestLocationPermission() async { //获取当前的权限 var status = await Permission.location.status; if (status == PermissionStatus.granted) { //已经授权 return true; } else { //未授权则发起一次申请 status = await Permission.location.request(); if (status == PermissionStatus.granted) { return true; } else { return false; } } } ///设置定位参数 void _setLocationOption() { AMapLocationOption locationOption = new AMapLocationOption(); ///是否单次定位 locationOption.onceLocation = false; ///是否需要返回逆地理信息 locationOption.needAddress = true; ///逆地理信息的语言类型 locationOption.geoLanguage = GeoLanguage.DEFAULT; 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); } ///开始定位 void _startLocation() { ///开始定位之前设置定位参数 _setLocationOption(); _locationPlugin.startLocation(); } ///停止定位 void stopLocation() { _locationPlugin.stopLocation(); } ///销毁定位 void destroyLocation() { _locationPlugin.destroy(); } Map<String, Object> getlocationResult(){ return _locationResult; } }
-
调用
/// 定位初始化 LocationUtils().init(); /// 申请定位权限并开启定位 LocationUtils().requestPermission();
Flutter 高德定位 permission_handler + amap_flutter_location 单例封装
最新推荐文章于 2024-03-28 09:31:15 发布