软件编程
位置:首页>> 软件编程>> Android编程>> Flutter集成高德地图并添加自定义Maker的实践

Flutter集成高德地图并添加自定义Maker的实践

作者:老李code  发布时间:2022-07-11 21:32:49 

标签:Flutter,高德地图,自定义Maker

目前地图开放平台三大巨头:高德、百度、腾讯基本都支持Flutter插件开发集成。从这里也能看出Flutter的生态在逐渐的完善。下面介绍下在Flutter项目集成高德地图的一些步骤和个人踩得一些坑。

一、进入高德地图开放平台申请Key

Android端需要设置发布版本和调试版本SHA1值,这里可以通过AndroidStudio 自带工具获取,

Flutter集成高德地图并添加自定义Maker的实践

点击会生成调式SHA1值。发布版本同理。

Flutter集成高德地图并添加自定义Maker的实践

接着我们设置完SHA1值和包名之后点击提交即可。

Flutter集成高德地图并添加自定义Maker的实践

iOS相对简单,只需要设置BundleId即可。

Flutter集成高德地图并添加自定义Maker的实践

二、yaml文件集成插件

这里我用的3.0.0版本,(定位功能看个人需求集成)。

# 高德地图、定位
amap_flutter_location: ^3.0.0
amap_flutter_map: ^3.0.0

这时我们已经成功的将地图功能集成到我们的Flutter项目中来了。 初始化:在我们需要的页面添加AMapWidget控件,下面参数按自己需求调整,

AMapWidget(
 mapType: MapType.navi,// 地图类型
 // customStyleOptions: CustomStyleOptions(
 //   true,
 //   styleData: styleData,
 //   styleExtraData: styleExtraData,
 // ),// 离线地图 按需添加
 onTap: widget.onTap,// 地图点击事件
 rotateGesturesEnabled: false,//旋转手势
 tiltGesturesEnabled: false,//倾斜手势
 scaleEnabled: false,//平移滚动
 // 隐私政策合规
 privacyStatement: AMapPrivacyStatement(
     hasContains: true, hasShow: true, hasAgree: true),
 apiKey: GdMap.aMapApiKey,// 双端Key值初始化
 onMapCreated: onMapCreated,// 创建成功回调
 markers: Set<Marker>.of(_initMarkerMap.values),// 自定义添加标记物
 // onLocationChanged: (m) {
 //   print("位置回调---${m.accuracy}");
 //   print("位置回调精度---${m.latLng.latitude}");
 //   print("位置回调伟度---${m.latLng.longitude}");
 // },
 onCameraMoveEnd: (pos) {
   //缩放级别
   var zoom = pos.zoom;
   this.zoom = zoom;

mapCenter =
       LatLng(pos.target.latitude, pos.target.longitude); // 更新中心点
   if (isLoad) {
     // 添加maker
     loadMakers(pos.target.latitude, pos.target.longitude);
   }
 },
),

特别注意:隐私政策合规这个参数必须要设置,否则地图加载不出来,并且一定要设置在首次安装启动弹窗之后初始化,目前国家对于个人隐私政策非常重视,Android应用市场的审核也对个人隐私加大了审核力度。到这里集成基本已经完成了,大家可以根据自己的业务需求来进行扩展。
三、添加自定义Maker
官方覆盖物只支持添加Bitmap类型,并不可以像原生那样添加一个自定义控件或者自定义布局,

/// 覆盖物的图标
final BitmapDescriptor icon;

但是官方有一个这样的方法:通过字节流转换,我的思路是将自定义Widget转换为字节流再转换为bitmap不就可以了吗?

/// 根据将PNG图片转换后的二进制数据[byteData]创建BitmapDescriptor
static BitmapDescriptor fromBytes(Uint8List byteData) {
 return BitmapDescriptor._(<dynamic>['fromBytes', byteData]);
}

思路: 通过RenderObjectToWidgetElement 将我们的Widget转换为image,再将image转换为字节流,这样就完美实现了自定义Maker的需求。
注意: 自定义Widget如果有文本Text组件的话必须加入Directionality嵌套并加上textDieecton属性,这个属性是代表书写顺序,从左到右,有些国家是从右到左,所以这块需要注意。

child: Directionality(
   textDirection: TextDirection.ltr,
   child:child),

源码:

static Future<ByteData?> widgetToImage(Widget widget,
   {Alignment alignment = Alignment.center,
   Size size = const Size(double.maxFinite, double.maxFinite),
   double devicePixelRatio = 1.0,
   double pixelRatio = 1.0}) async {
 RenderRepaintBoundary repaintBoundary = RenderRepaintBoundary();

RenderView renderView = RenderView(
   child: RenderPositionedBox(alignment: alignment, child: repaintBoundary),
   configuration: ViewConfiguration(
     size: size,
     devicePixelRatio: devicePixelRatio,
   ),
   window: ui.window,
 );

PipelineOwner pipelineOwner = PipelineOwner();
 pipelineOwner.rootNode = renderView;
 renderView.prepareInitialFrame();

BuildOwner buildOwner = BuildOwner(focusManager: FocusManager());
 RenderObjectToWidgetElement rootElement = RenderObjectToWidgetAdapter(
   container: repaintBoundary,
   child: widget,
 ).attachToRenderTree(buildOwner);
 buildOwner.buildScope(rootElement);
 buildOwner.finalizeTree();

pipelineOwner.flushLayout();
 pipelineOwner.flushCompositingBits();
 pipelineOwner.flushPaint();

ui.Image image = await repaintBoundary.toImage(pixelRatio: pixelRatio);
 ByteData? byteData = await image.toByteData(format: ui.ImageByteFormat.png);

return byteData;
}

总结:高德地图的集成还是非常方便的,插件质量也还算稳定,因为我没有用过百度和腾讯的也不好做比较,但是有一点值得吐槽的是现在三大厂商联合针对企业账号收取企业授权费,5万/年,还不打折,只要你是企业账号,就是没流量也要收你1年5万,这点真的对于新开发的App并且流量不多的情况下非常的不银杏~~ ,以后也许会更换平台,到时候再分享其他平台的地图方案

来源:https://juejin.cn/post/7083413148006350856

0
投稿

猜你喜欢

  • 一.背景最近业务需求需要导出Execl,最终做出的效果如下,中间牵扯到大量的数据计算。二.疑难问题分析问题1:跨单元格处理及边框设置问题2:
  • 最近在项目中有这么个需求,就是得去实时获取某个在无规律改变的文本文件中的内容。首先想到的是用程序定期去访问这个文件,因为对实时性要求很高,间
  • 在上面的例子中多次使用到了Thread类的join方法。我想大家可能已经猜出来join方法的功能是什么了。对,join方法的功能就是使异步执
  • Scala异常处理Scala是一种多范式的编程语言,支持面向对象和函数式编程。Scala也支持异常处理,即在程序运行过程中发生意外或错误时,
  • 1.编写核心类MainApp:package com.yiidian.gson;import com.google.gson.Gson;im
  • 本文实例为大家分享了JS Struts2多文件上传的具体代码,供大家参考,具体内容如下1、JSP页面: JS控制增加删除多个上传文件框,代码
  • 高效检索海量信息(经典查找算法)是现代信息世界的基础设施。我们使用符号表描述一张抽象的表格,将信息(值)存储在其中,然后按照指定的键来搜索并
  • 这段时间花了点时间整理了几个新手易犯的典型缺陷(专门针对C#的),但是个人的力量毕竟有限缺陷的覆盖面比较窄,有些缺陷的描述也不够准确,这里先
  • 文件上传在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以common
  • 若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的。 通常情况下, 静
  • 在实际的应用中会经常需要将数据导出成excel,导出的方式除原样导出还有分页导出、分页分sheet导出和大数据量导出。对于excel2003
  • 为了表示不同的浓度值,对颜色条应用颜色梯度变化,基本方法是对ARGB分量乘以一个渐变系数。下面是对十种颜色应用的三个梯度值的过程。 publ
  • 本文为大家分享了java interface的两个经典用法,供大家参考,具体内容如下1.Java多态接口动态加载实例编写一个通用程序,用来计
  • 在使用spring boot进行打包的时候出现了一些问题,不是说找不到主类,就是说spring初始化时有些类没有加载。下面介绍一下如何解决。
  • 由于处理器核心的增长及较低的硬件成本允许低成本的集群系统,致使如今并行编程无处不在,并行编程似乎是下一个大事件。Java 8 针对这一事实提
  • 很多人使用Nacos其实并没有真正的去读过官网,以至于忽视了很多重要的细节,Nacos为我们提供了大量API,但是这些API默认是没有开启认
  • Java Double相加出现的怪事问题的提出编译运行下面这个程序会看到什么public class test { public stati
  • 高分配速率(High Allocation Rate)分配速率(Allocation rate)表示单位时间内分配的内存量。通常使用&nbs
  • 在使用Java Swing开发UI程序时,很有可能会遇到使用带复选框的树的需求,但是Java Swing并没有提供这个组件,因此如果你有这个
  • 本文为大家分享了使用栈的迷宫算法java版,主要考察栈的使用,供大家参考,具体内容如下主要思路如下: do { if(当前位置可通过) {
手机版 软件编程 asp之家 www.aspxhome.com