天天看点

Flutter使用高德地图获取定位Flutter使用高德地图获取定位

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();
    }
  }