Flutter集成高德地图并添加自定义Maker的实践
作者:老李code 发布时间:2022-07-11 21:32:49
目前地图开放平台三大巨头:高德、百度、腾讯基本都支持Flutter插件开发集成。从这里也能看出Flutter的生态在逐渐的完善。下面介绍下在Flutter项目集成高德地图的一些步骤和个人踩得一些坑。
一、进入高德地图开放平台申请Key
Android端需要设置发布版本和调试版本SHA1值,这里可以通过AndroidStudio 自带工具获取,
点击会生成调式SHA1值。发布版本同理。
接着我们设置完SHA1值和包名之后点击提交即可。
iOS相对简单,只需要设置BundleId即可。
二、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


猜你喜欢
- 代码public class LamdaDemo{ public static void main( String[] args
- 前言多数据源的事务处理是个老生常谈的话题,跨两个数据源的事务管理也算是分布式事务的范畴,在同一个JVM里处理多数据源的事务,比较经典的处理方
- 一、 Sharding-jdbc简介“Sharding-jdbc是开源的数据库操作中间件;定位为轻量级Java框架,在Java的JDBC层提
- 本文实例为大家分享了C#15子游戏的实现代码,供大家参考,具体内容如下所需控件:一个Button,拖入Form1中即可。源码:using S
- 本文实例讲述了Java基于外观模式实现美食天下食谱功能。分享给大家供大家参考,具体如下:一、模式定义外观模式,是软件工程师常用的一种软件设计
- NDK部分1、下载ndk这里就一笔带过了。2、解压ndk不要解压,文件权限会出错。执行之,会自动解压,然后mv到想放的地方。我放到了”/us
- 这里简单介绍一下ZXing库。ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口。
- 目录为什么要实现调用链跟踪?如何实现?第一步,看图、看场景,用户浏览器的一次请求行为所走的路径是什么样的第二步,实现。不想看代码可直接拉最后
- 适合人群学完Java基础想通过Java快速构建web应用程序想学习或了解SpringBoot背景本节给大家讲讲 Java的Spri
- 作为工厂方法模式的孪生兄弟,相信大家对工厂方法模式和抽象工厂模式傻傻分不清楚吧。那么,就让我来拯救大家吧!抽象工厂模式定义:所谓抽象工厂模式
- 本文实例为大家分享了Android实现自动转圈效果展示的具体代码,供大家参考,具体内容如下在values文件夹下创建attrs.xml<
- Rxjava功能个人感觉很好用,里面的一些操作符很方便,Rxjava有:被观察者,观察者,订阅者,被观察者通过订阅者订阅观察者,从而实现观察
- 一、概述之前公司app里面有个功能是一个可以双向滑动的范围选择器,我在网上百度过一些实现方法,感觉各有利弊吧,但是都不太适合我们的需求。所以
- springboot整合MySQL很简单,多数据源就master,slave就行了,但是在整合DB2就需要另起一行,以下是同一个yml文件先
- 其他人写的都是调用非托管kernel32.dll。我也用过 但是感觉兼容性有点不好 有时候会出现编码错误,毕竟一个是以前的系统一个是现在的系
- 废话不多说了,直接给大家贴代码了,具体代码如下所示:html代码如下:<body><input id="file
- 布局:<?xml version="1.0" encoding="utf-8"?><
- 简介Maven为我们封装了很多构建中非常有用的操作,我们只需要执行简单的几个mvn命令即可。今天我们要讨论一下mvn命令之下的生命周期的构建
- 1.委托delegate委托delegate也是一种类型,在任何可以声明类的地方都可以声明委托,它将方法当做另一个方法的参数进行传递,这样就
- 原理和listview一样 ,都是重写Android原生控件Activitypackage com.example.refreshgridv