八、Flutter集成高德地图

目前支持Flutter的第三方库还不多,地图作为一个高频使用的功能非常重要,但是国内常用的百度、高德都还没有官方的支持,只能找第三方库来支持。而第三方库目前做不到完全支持,像一些自定义地图和marker的绘制就很难搞定,只能进行定位和常规地图展示、搜索。
目前比较常用的有 flutter_amap_locationamap_base_flutter

① flutter_amap_location的集成使用

一、申请APIkey

前往 https://lbs.amap.com/api/android-sdk/guide/create-project/get-key 申请APIkey,新建一个应用,分别添加key,其中要获取SHA1值。

  • Mac下AndroidStudio获取SHA1值:
    第一步、打开Android Studio的Terminal工具;
    第一步、输入命令:cd ~/.android ;
    第二步、输入命令:keytool -list -v -keystore debug.keystore ;
    第四步、输入Keystore密码,一般直接回车就行,或者输入android。


这里就获取到SHA1值,就可以在高德地图后台申请APIkey了。

而packageName就在build.gradle(app)里,取applicationId。

  • 获取iOS Bundle identifier:
    用XCode打开我们的项目,按图获取到Bundle identifier


在后台填入添加key。

二、配置集成高德地图

添加依赖,无须填版本号

dependencies:
  amap_location:

导入包

import 'package:amap_location/amap_location.dart';

Android配置,在build.gradle(app)中添加AMAP_KEY即可。

android {
    .... 你的代码
    defaultConfig {
        .....
        manifestPlaceholders = [
                AMAP_KEY : "xxxxxx", /// 高德地图key
        ]

    }

iOS配置,在程序的主入口 main.dart

void main() {
  AMapLocationClient.setApiKey("xxxxxx");
  runApp(new MyApp());
}

在info.Plist添加权限

    <key>NSLocationWhenInUseUsageDescription</key>
    <string>需要用到定位</string>
    <key>UIBackgroundModes</key>
    <array>
        <string>location</string>
    </array>

三、代码调用

上一步提到了在main.dart设置iOS的key

void main() {
  AMapLocationClient.setApiKey("xxxxxx");
  runApp(new MyApp());
}

再在需要使用到的页面进行定位初始化,这里实现的功能比较简单,每次监听到坐标就赋值给lat和long,在Text中打印坐标

  //初始化定位监听,
  void _initLocation() async {
    AMapLocationClient.startup(new AMapLocationOption(
        desiredAccuracy: CLLocationAccuracy.kCLLocationAccuracyHundredMeters));

    //监听坐标实时变换
    AMapLocationClient.onLocationUpate.listen((AMapLocation loc) {
      if (!mounted) return;
      setState(() {
        lat = loc.latitude;
        long = loc.longitude;
      });
    });

    AMapLocationClient.startLocation();
  }

当前代码并没有对权限进行判断,若运行后lat、long打印出来是null,去设置里查看下是否打开了定位权限。如果有其他问题,查看loc.code,根据code去官网查看对应错误。

四、关闭定位

最后在dispose中关闭定位,防止内存泄漏

  @override
  void dispose() {
    //注意这里关闭
    AMapLocationClient.shutdown();
    super.dispose();
  }

但是目前为止只能进行定位,没办法进行地图展示等功能,功能不够丰富。

② amap_base_flutter的集成使用

amap_base_flutter包含的功能更多,不仅仅是定位,还集成了简单的地图展示、导航、搜索等功能,使用上和上个库也差不多,github上还有相关的demo: https://github.com/OpenFlutter/amap_base_flutter/tree/master/example/lib

一、申请APIkey

APIkey的申请同上,申请过的话就直接用已经有的key。

二、添加依赖

添加依赖和flutter_amap_location差不多,在Android和iOS分别设置APPkey,需要权限的话,分别在配置文件中添加。
添加dependencies

  amap_base: ^0.2.12

导入包

  import 'package:amap_base/amap_base.dart';

Android配置
在AndroidManifest.xml中设置appkey,注意设置在application节点下

<application>
    ...
    <meta-data
        android:name="com.amap.api.v2.apikey"
        android:value="您的Key"/>
</application>

iOS配置同上,在程序的主入口 main.dart

void main() {
  AMap.init('您的Key');
  runApp(new MyApp());
}

另外显示地图的话需要另外设置,iOS端的UiKitView目前还只是preview状态, 默认是不支持的, 需要手动打开开关, 在info.plist文件中新增一行io.flutter.embedded_views_preview为true.

三、代码调用

核心代码

  final _amapLocation = AMapLocation();
  var _result = '';

  //初始化定位监听
  void _initLocation() async {
    _amapLocation.init();

    final options = LocationClientOptions(
      isOnceLocation: false,
      locatingWithReGeocode: true,
    );

    if (await Permissions().requestPermission()) {
      _amapLocation.startLocate(options).listen((_) => setState(() {
            _result =
                '坐标:${_.longitude},${_.latitude} @ ${DateTime.now().hour}:${DateTime.now().minute}:${DateTime.now().second}';
          }));
    } else {
      setState(() {
        _result = "无定位权限";
      });
    }
  }

比上个库好的是它自带了一个权限检测的方法。

四、关闭定位

最后在dispose中关闭定位,防止内存泄漏

  @override
  void dispose() {
    //注意这里关闭
    _amapLocation.stopLocate();
    super.dispose();
  }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,009评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,808评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,891评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,283评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,285评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,409评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,809评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,487评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,680评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,499评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,548评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,268评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,815评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,872评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,102评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,683评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,253评论 2 341

推荐阅读更多精彩内容