在上一篇文章从头开发一个Flutter插件(一)开发流程里具体介绍了flutter插件的具体开发流程,从创建项目到发布。接下来将会为Flutter天气项目开发一个基于高德定位sdk的flutter定位插件。

申请key

首先先进入到高德地图定位sdk文档内下载定位sdk,并按要求申请app key,这里不多做介绍,文档已经很详细了

配置环境

sdk文档里同样有关于配置工程的demo,但是因为flutter 插件项目不是一个android工程,所以会有所区别。大致分以下几步:

1.集成远程依赖

compile 'com.amap.api:location:latest.integration'

复制代码

2.配置app key

在AndroidManifest.xml的application标签中配置Key:

android:value="您的Key">

复制代码

3.声明service

在application标签中声明service组件:

复制代码

4.声明权限

flutter插件的目的就是隔离对sdk native code的实现,让使用者直接使用dart代码就可以获得到sdk提供的定位信息,插件和使用者交互的代码是在libs下的dart文件中提供的接口。

插件的android文件夹下面是一个完整的android工程结构,我们在这个工程下完成上述的四步。唯一一点不同的是,配置app key利用gradle里的manifestPlaceholders属性为用户预留,让用户自己来填写。

于是配置app key改写成:

android:name="com.amap.api.v2.apikey"

ndroid:value="${LOCATION_APP_KEY}"/>

复制代码

这个LOCATION_APP_KEY,使用者使用插件的时候在自己flutter项目的android工程下的app/build.gradle文件里填写自己申请的高德key即可。

android {

compileSdkVersion 27

lintOptions {

...

}

defaultConfig {

...

manifestPlaceholders = [

LOCATION_APP_KEY : "b947abf0a6820efedc65d06428f14281", /// 高德地图key

]

}

}

复制代码

到目前为止,一个基于高德sdk的定位插件工程就算配置好了,下面就是实现部分。

实现

flutter 插件最终暴露给插件使用者的是dart代码的接口,使用者不再需要关心Android和Ios平台上的代码,在定位插件项目中,唯一需要配置的就是上文所说的高德开放平台的app key.

因为现在是将特定平台的sdk开发成插件供flutter app使用,其实就可以理解在Android或者ios平台正常开发项目,将flutter app需要的数据传递过去,flutter插件只是在特定平台的实现上做了一次封装与隔离,封装了dart接口,隔离了两个不同平台实现的差异。

理解这个概念,写出一个flutter插件就变得很容易了,dart和java之间的相互通信在前面写的一篇文章Flutter探索与实践中Flutter和原生互相通信一节讲述过,这里就直接上手展示源码。

Java部分

java部分的代码写在了AmapLocationPlugin.java类下面,它分别实现了MethodChannel.MethodCallHandler, EventChannel.StreamHandler。并且在registerWith方法调用的实例化MethodChannel和EventChannel。

final MethodChannel methodChannel = new MethodChannel(registrar.messenger(), "plugin.kinsomy.com/methodchannel");

final EventChannel eventChannel = new EventChannel(registrar.messenger(), "plugin.kinsomy.com/eventchannel");

复制代码重写MethodChannel.MethodCallHandler的onMethodCall方法接受dart代码的方法调用

@Override

public void onMethodCall(MethodCall call, Result result){

if (call.method.equals("startLocation")) {

//启动定位

mLocationClient.startLocation();

} else if (call.method.equals("stopLocation")) {

//停止定位

mLocationClient.stopLocation();

} else if (call.method.equals("getLocation")) {

result.success(mLocation);

} else {

result.notImplemented();

}

}

复制代码重写EventChannel.StreamHandler的onListen,该方法携带了一个EventChannel.EventSink实例,通过该实例对象可以调用mEventSink.success()向dart传递数据流,也就是插件里的定位信息

@Override

public void onListen(Object o, EventChannel.EventSink eventSink){

this.mEventSink = eventSink;

}

复制代码通过高德sdk的AMapLocationClient获取到定位信息,并将其封装成json字符串供dart调用。

dart部分

dart部分的代码在项目根目录lib文件夹下的amap_location_plugin.dart文件。

在构造函数里实例化和java代码中同样channel name的MethodChannel与EventChannel

factory AmapLocation() {

if (_instance == null) {

final MethodChannel methodChannel =

const MethodChannel('plugin.kinsomy.com/methodchannel');

final EventChannel eventChannel =

const EventChannel('plugin.kinsomy.com/eventchannel');

_instance = AmapLocation.private(methodChannel, eventChannel);

}

return _instance;

}

复制代码提供接口方法开始定位startLocation和对应的停止定位

Future get startLocation =>

_methodChannel.invokeMethod("startLocation");

复制代码实例化Stream接受event返回的定位数据

Stream _onLocationFetched;

_onLocationFetched =

_eventChannel.receiveBroadcastStream().map((dynamic event) => event);

复制代码

这样一个基于高德定位sdk的flutter定位插件就算完成了,在example里写一个demo实际测试一下。

目前这个插件还是个简易版本,未来希望能加上地图,导航,线路规划等一系列的功能

项目地址 ,欢迎贡献代码和issue,喜欢可以给个star

参考文档

flutter 获取定位_从头开发一个Flutter插件(二)高德地图定位插件相关推荐

  1. flutter 获取定位_10分钟让你的flutter程序拥有定位功能--集成高德地图定位指南...

    地图定位这个功能目前基本上是商业应用app的标配.然而,在flutter中进行原生功能的开发,意味着必须的ios和android双端都通,而且需要大量的调试时间.尤其目前这个时间点,flutter的版 ...

  2. 安卓开发 高德地图定位的封装 十分钟上手

    前言 地图作为开发中三方sdk中较常遇到的一项,集成起来并不麻烦但是不小心踩坑可能会浪费较多时间,如果项目中多处使用还容易造成代码大量冗余,今天我们来将高德地图定位功能集成一个功能化模块,只需两分钟应 ...

  3. Android开发实现高德地图定位详解

     一. 要实现高德地图定位呢,首先需要做好以下几步准备: 1. 在高德开放平台注册帐号 注册地址:http://lbs.amap.com 2. 在开发中下载Android平台下的地图SDK和定位S ...

  4. [python] 开发一个跟随角色移动的地图游戏demo

    用python开发一个2D角色游戏的地图Demo 如今很多大学生大学学习了编程语言,想做游戏却迟迟做不出一个游戏雏形来,接下来就和大家谈论下游戏中地图移动的简单原理并用python这一门非常火的语言进 ...

  5. vue 高德地图 定位插件 地图实例插件 获取点击的地方的经纬度和具体地址

    npm 安装 推荐 npm 安装. npm install vue-amap --saveimport VueAMap from 'vue-amap';Vue.use(VueAMap); VueAMa ...

  6. android 高德地图定位获取经纬度

    android 高德地图定位获取经纬度 之前开发定位都是集成百度的,领导说要用高德的,没办法干吧,官方的文档太详细了看着真累. 我们得先去官网注册开发者账号,创建应用,填写自己项目的包名和SHA1, ...

  7. android中高德地图定位功能并且获取定位的城市

    一.概述 今天再一次用到了地图定位功能和地图显示功能,以前一直用的是高德地图定位,这次还是用高德,记录一下以便以后再做时方便一些.因为业务需要的功能不是很全,可以参考https://www.2cto. ...

  8. 高德地图去掉定位按钮_怎样修改百度地图店名怎么取消高德地图定位

    11月28日下午,**百度地图今天公布了与四个北欧旅游局的战略合作,并公布了本月将在非洲.欧洲和亚洲推出的106个国家. 今年4月,百度地图正式发布了*对外开放国际化战略,并在年底宣传完成150多个国 ...

  9. uniapp使用高德地图定位(兼容app)

    1.获取Key  查看官方文档 需要:应用包名和SHA1(获取方法查看) ​2.配置manifest.json ​ 3.设置安全通讯域名 登录微信公众平台,在 "设置"->& ...

最新文章

  1. 3D打印,智能砖,竹子城市……改变未来建筑业的8项技术
  2. nginx和fpm的进程数配置和502,504错误
  3. TSQL批处理插入一万条记录-随机生成某些字段值
  4. linux c 图像处理,基于uClinux的图像处理及Socket传输的实现-计算机应用与软件.PDF...
  5. 把普通的git库变成bare库
  6. 40万总奖金!顶级云服务免费用!2021全球高性能云计算创新大赛报名中!
  7. 如何在Java中找到整数的质因数–因式分解
  8. 【渝粤教育】电大中专建筑力学 (4)作业 题库
  9. nginx 多php项目配置文件,nginx 配置文件配置多个站点
  10. 从template到DOM(Vue.js源码角度看内部运行机制)
  11. 如何产生好的词向量?
  12. Gerserver:发布shp文件
  13. php base64_decode 图片,php读取和保存base64编码图片
  14. IC卡清卡软件的使用
  15. bootdo 重命名 版本2.0 (适合所有springboot项目)
  16. 【cofface】酷派手机升级助手Coolpad Download Assistant图文教程
  17. “3W1H法”浅析三层架构
  18. Feign报错java.lang.NoSuchFieldError: MULTIPART_RELATED
  19. android 手机录屏功能,手机自带录屏功能在哪里找?轻松搞定屏幕录制
  20. DWC的1000M的MAC自环和PHY自环测试寄存器修改方式

热门文章

  1. python res_Python models.resnet152方法代码示例
  2. 动态创建 @ViewChild 导致运行时错误的原因分析
  3. SAP ABAP 平台新的编程模型
  4. 如何处理 Hybris Accelerator css style 显示不正确的问题
  5. SAP 电商云 Spartacus Schematics 开发环境搭建
  6. SAP ABAP SteammPunk 蒸汽朋克的最新进展 - 嵌入式蒸汽朋克
  7. Jest 测试框架使用的学习笔记
  8. SAP Spartacus 里 对 isPlatformBrowser API 的使用
  9. Angular Component input字段传递值的几种变式 variant
  10. nodejs项目的package-lock.json文件的用途