当前位置: 首页 > news >正文

高德地图 Flutter 插件:跨 Android / iOS / HarmonyOS 的完整实现

高德地图 Flutter 插件:跨 Android / iOS / HarmonyOS 的完整实现

背景

高德官方提供了amap_flutter_map插件,但仅支持 Android 和 iOS 平台。随着 HarmonyOS NEXT 的发布,Flutter 开发者在鸿蒙生态中缺少一份可用的高德地图插件。

本项目在官方插件的基础上,完整实现了 HarmonyOS 原生适配,使同一套 Flutter 代码可以同时运行在 Android、iOS 和 HarmonyOS 三端。

插件地址:https://gitee.com/dileber/amap_flutter_map


接入方式

pubspec.yaml中通过 Git 依赖引入:

dependencies:amap_flutter_map:git:url:https://gitee.com/dileber/amap_flutter_map.git

支持的功能

地图基础能力

功能说明
地图类型切换普通地图、卫星图、导航图等
手势控制缩放、滑动、旋转、倾斜
相机控制移动、缩放、动画过渡
缩放级别限制最小/最大缩放范围
地图边界限制限制可滑动区域
自定义地图样式支持自定义主题切换
定位蓝点真实 GPS 定位 + 精度圈
截图地图快照
POI 点击地图 POI 交互

覆盖物

类型说明
Marker支持自定义图标、信息窗口、拖拽
Polyline支持颜色、线宽、虚线、大地曲线、纹理
Polygon支持填充色、边框色、边框宽度

与官方插件的核心差异:自定义地图样式

这是本插件与官方版本最重要的区别。

官方方案:二进制数据传输

官方CustomStyleOptions使用styleDatastyleExtraData字段传输二进制数据:

// 官方方式ByteDatastyleByteData=awaitrootBundle.load('assets/default_style.data');_customStyleOptions.styleData=styleByteData.buffer.asUint8List();

Flutter 层将几 MB 的样式文件通过 Platform Channel 序列化传输到原生层。

本插件方案:路径引用

本插件将styleData/styleExtraData替换为styleDataPath/styleExtraDataPath,仅传递文件名:

// 本插件方式_customStyleOptions.styleDataPath="default_style.data";_customStyleOptions.styleExtraDataPath="default_style_extra.data";

原生层收到路径后,直接从本地资源目录读取文件:

  • Android:从assets/目录读取
  • HarmonyOS:从resources/rawfile/目录读取

为什么这样做?

1. 性能瓶颈

Uint8List.toString()会将每个字节逐一输出为字符串。一个 2MB 的样式文件,toString()会生成类似[0,1,2,...,255,0,1,...]的超长字符串,耗时数秒。在setState触发的组件重建中,如果CustomStyleOptions携带了二进制数据,每次重建都会触发这个比较操作,导致明显的 UI 卡顿。

2. 传输开销

Platform Channel 的StandardMessageCodec在序列化大数据时会产生额外的内存拷贝和 GC 压力。样式文件通常有几 MB,每次切换自定义地图都会触发一次完整的序列化-反序列化流程。

3. 路径方案的优势
维度二进制传输路径引用
Flutter→原生传输大小几 MB几十字节
toString()比较耗时数秒瞬间
内存占用双倍(Flutter + Channel)仅原生侧
切换流畅度明显卡顿无感知

资源文件放置

使用路径方案时,需要将样式文件放到原生资源目录:

example/android/app/src/main/assets/ ├── default_style.data └── default_style_extra.data example/ohos/entry/src/main/resources/rawfile/ ├── default_style.data └── default_style_extra.data

架构设计

┌─────────────────────────────────────────────┐ │ Flutter (Dart) │ │ AMapWidget ──→ MethodChannel ──→ Events │ └──────────────┬──────────────┬───────────────┘ │ │ ┌──────────▼──────┐ ┌───▼──────────────┐ │ Android │ │ HarmonyOS │ │ (Java/Kotlin) │ │ (ArkTS) │ │ │ │ │ │ MapController │ │ MapController │ │ AMapPlatformView│ │ AMapView │ │ ConvertUtil │ │ ConvertUtil │ └─────────────────┘ └──────────────────┘

三端共用同一套 Dart 接口,原生层各自实现。开发者无需关心平台差异,调用方式与官方插件完全一致。


快速开始

1. 配置 API Key

AMapWidget(apiKey:'your_android_ios_key',ohosApiKey:'your_harmonyos_key',initialCameraPosition:CameraPosition(target:LatLng(39.90882,116.39747),zoom:13,),onMapCreated:(controller){_mapController=controller;},)

2. 添加 Marker

AMapWidget(markers:{Marker(position:LatLng(39.90882,116.39747),title:'北京',icon:BitmapDescriptor.defaultMarker,),},)

3. 自定义地图样式

// 设置路径(在 initState 中调用)_customStyleOptions.styleDataPath="default_style.data";_customStyleOptions.styleExtraDataPath="default_style_extra.data";// 切换开关setState((){_customStyleOptions.enabled=true;});

总结

本插件在官方amap_flutter_map的基础上:

  1. 补全了 HarmonyOS 原生实现,让 Flutter 高德地图真正跨三端运行
  2. 优化了自定义地图样式的传输方式,从二进制传输改为路径引用,彻底解决了切换卡顿问题
  3. 保持了与官方一致的 API 设计,迁移成本为零

如果你正在开发支持 HarmonyOS 的 Flutter 地图应用,这个插件可以直接使用。

http://www.rkmt.cn/news/1419511.html

相关文章:

  • 别再死记硬背了!用74LS74和74LS76芯片,手把手教你玩转D、JK、T触发器转换(附波形图分析)
  • Cocos学习笔记:自定义字体、骨骼动画与项目架构
  • 搞定7nm DRC收敛:一份来自Innovus和ICC2实战的避坑清单(附脚本)
  • 告别乱码!实测三款主流Java反编译工具(JD-GUI、Luyten、Jadx)的导出源码对比
  • 用STM32CubeIDE搞定TB6612驱动GB37-520电机:从引脚配置到PWM频率计算全流程
  • fselect:用类SQL语句查找文件
  • AI 告诉你代码安全,它在骗你!
  • PS如何提高照片清晰度?3个方法零基础也能快速搞定高清修图
  • GPT5.5对Gemini3.5对DeepSeekV4编程能力横评
  • 别再死记硬背build.gradle了!用Groovy闭包和DSL思维,5分钟看懂Gradle配置的本质
  • 不只是VMware:开启AMD-V后,你的Win10/Win11还能玩转这些虚拟化工具
  • AI与机器学习驱动的智能运营:从数据到决策的自动化闭环
  • 别再只用洞洞板了!用嘉立创EDA+370电机,低成本搞定POV旋转LED全套硬件
  • 保姆级教空间转录组分析| 01. 绪论
  • 从5篇高温合金文章到16层协议:一个工业AI知识萃取的方法论
  • 用N32G031的TIM1驱动无刷电机:从寄存器配置互补PWM到死区时间实战避坑
  • Elasticsearch聚合分析实战
  • FreeRTOS性能调优利器:用SystemView揪出任务阻塞和中断延迟的元凶
  • 学习导师:从工具模式到感知模式的整合
  • LogAnalyzer实战:除了看系统日志,我这样用它监控Nginx访问和MySQL慢查询
  • AI赋能客户体验:从智能客服到预测性服务的实战指南
  • 别再混淆了!用Python的sklearn手把手教你算多分类的Precision、Recall和Accuracy
  • 164-基于Python的甜点销售数据可视化分析系统
  • ♪苍穹外卖♪Day2 | 项目日记
  • Hermes Agent 完全使用指南:从安装到多平台部署的全流程教程
  • 战略落地难?试试分拆对
  • 项目介绍 MATLAB实现基于SVM-LSTM支持向量机(SVM)结合长短期记忆网络(LSTM)进行回归预测(含模型描述及部分示例代码)专栏近期有大量优惠 还请多多点一下关注 加油 谢谢 你的鼓励是我
  • 别再硬编码了!用HTN框架让游戏AI自己找最优解(附Unity/Unreal实现思路)
  • 【DeepSeek云服务部署黄金标准】:工信部认证AI云平台合规部署 checklist(限免领取)
  • 告别手动点点点!用ArcMap‘按位置选择’高效处理空间分析(附实战案例)