鸿蒙Flutter实战:19-Flutter集成高德地图,跳转页面方式

鸿蒙 Flutter 实战:19-MethodChannel 集成高德地图

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

前言

在之前的文章 现有 Flutter 项目支持鸿蒙 II 中,介绍了如何使用第三方插件,同时给出了非常多的使用案例,如 flutter_inappwebview,video_player, image_picker 等。本文将介绍如何使用 MethodChannel 集成高德地图

提示:集成地图功能有两种方式,本文介绍 MethodChannel 方式,下篇将介绍 PlatformView 同层渲染方式。

一、整体方案

1.1 方案概述

通过 MethodChannel 进行消息通信,在 Dart 侧调用原生 API,在 ArkTS 侧收到相关调用后,根据参数跳转到指定页面。

1.2 架构设计

┌─────────────────┐         ┌─────────────────┐
│   Flutter 侧    │         │   鸿蒙 ArkTS 侧   │
│                 │         │                 │
│  redirectNative │ ──────► │  OhosPlugin     │
│      (url)      │  消息    │  router.pushUrl │
│                 │  通信    │      (url)      │
│                 │         │      │          │
│                 │         │      ▼          │
│                 │         │   Amap 页面     │
└─────────────────┘         └─────────────────┘

1.3 实现步骤

步骤内容说明
1Dart 侧定义调用方法封装 MethodChannel 调用
2ArkTS 侧实现插件接收消息并处理
3注册插件在 EntryAbility 中注册
4创建地图页面编写 ArkTS 地图组件
5配置 SDK添加高德地图依赖

二、Dart 侧实现

2.1 定义 MethodChannel

static const MethodChannel _methodChannel = MethodChannel('xxx.com/app');

/// 跳转到原生页面
static Future<dynamic> redirectNative(String url) {
  return _methodChannel.invokeMethod("redirectNative", {
    "url": url,
  });
}

2.2 调用示例

// 跳转到高德地图页面
PlatformCall.redirectNative('pages/Amap');

三、ArkTS 侧实现

3.1 创建插件文件

ohos/entry/src/main/ets/entryability 目录创建 OhosPlugin.ets 文件。

3.2 实现插件逻辑

import { FlutterPlugin, FlutterPluginBinding, MethodCall, MethodResult, MethodChannel, StandardMessageCodec } from '@ohos/flutter_ohos';
import router from '@ohos.router';

export default class OhosPlugin implements FlutterPlugin {
  private channel?: MethodChannel;

  getUniqueClassName(): string {
    return "OhosPlugin";
  }

  onAttachedToEngine(binding: FlutterPluginBinding): void {
    this.channel = new MethodChannel(binding.getBinaryMessenger(), "xxx.com/app");
    this.channel.setMethodCallHandler({
      onMethodCall: (call: MethodCall, result: MethodResult) => {
        switch (call.method) {
          case "redirectNative":
            let url = String(call.argument("url"));
            router.pushUrl({ url: url });
            result.success(true);
            break;
          default:
            result.notImplemented();
            break;
        }
      }
    })
  }

  onDetachedFromEngine(binding: FlutterPluginBinding): void {
    this.channel?.setMethodCallHandler(null);
  }
}

这里收到消息后,调用 router.pushUrl 方法跳转到指定页面。

3.3 注册插件

插件写好后,需要在 EntryAbility 中注册:

import { FlutterAbility, FlutterEngine } from '@ohos/flutter_ohos';
import { GeneratedPluginRegistrant } from '../plugins/GeneratedPluginRegistrant';
import OhosPlugin from './OhosPlugin';

export default class EntryAbility extends FlutterAbility {
  configureFlutterEngine(flutterEngine: FlutterEngine) {
    super.configureFlutterEngine(flutterEngine);
    GeneratedPluginRegistrant.registerWith(flutterEngine);
    this.addPlugin(new OhosPlugin());
  }
}

四、创建地图页面

4.1 创建空页面

回到 DevEco,在 pages 目录右键,创建一个空页面,命名为 Amap。

创建空页面

在 DevEco 中创建新的页面

4.2 配置 SDK

ohos/entry/oh-package.json 文件中引入高德地图 SDK:

{
  "dependencies": {
    "@amap/amap_lbs_common": ">=1.1.0",
    "@amap/amap_lbs_map3d": ">=2.1.1"
  }
}

4.3 实现地图页面

import { AMap, MapsInitializer, MapView, MapViewComponent, MapViewManager } from '@amap/amap_lbs_map3d';

// 配置 API KEY
MapsInitializer.setApiKey("你的密钥");

MapViewManager.getInstance().registerMapViewCreatedCallback((mapview?: MapView, mapViewName?: string) => {
  if (!mapview) {
    return;
  }
  let mapView = mapview;
  mapView.onCreate();
  mapView.getMapAsync((map) => {
    let aMap: AMap = map;
    // 地图操作
  })
})

@Entry
@Component
struct Index {
  build() {
    Row() {
      MapViewComponent()
        .width('100%')
        .height('100%')
    }
  }
}

五、配置 build-profile.json5

5.1 常见问题

如果在运行时遇到以下错误:

ERROR: Bytecode HARs: [@amap/amap_lbs_map3d, @amap/amap_lbs_common] not supported when useNormalizedOHMUrl is not true.

5.2 解决方案

根据 官方说明,需要配置 useNormalizedOHMUrl

打开文件 /ohos/build-profile.json5, 添加以下配置:

{
  "app": {
    "products": [
      {
        "buildOption": {
          "strictMode": {
            "useNormalizedOHMUrl": true
          }
        }
      }
    ]
  }
}

六、完整调用流程

6.1 流程说明

步骤操作说明
1Dart 调用PlatformCall.redirectNative('pages/Amap')
2MethodChannel消息传递到 ArkTS 侧
3插件处理OhosPlugin 接收并解析参数
4路由跳转router.pushUrl 跳转到地图页面
5页面显示MapViewComponent 渲染地图

6.2 注意事项

提示:以下是开发过程中需要注意的关键点。

  1. Channel 名称一致 - Dart 和 ArkTS 两侧的 Channel 名称必须相同
  2. API Key 配置 - 需要在高德地图开放平台申请
  3. 权限配置 - 需要在 module.json5 中配置网络、定位等权限
  4. 密钥安全 - 不要将密钥硬编码在代码中

七、运行截图

高德地图运行效果

高德地图在鸿蒙 Flutter 项目中成功运行

总结

本文介绍了使用 MethodChannel 在鸿蒙 Flutter 项目中集成高德地图的完整流程:

  1. Dart 侧 - 定义 MethodChannel 调用方法
  2. ArkTS 侧 - 实现插件接收消息并跳转
  3. 地图页面 - 创建页面并配置 SDK
  4. 配置优化 - 处理常见编译问题

提示:本文介绍的是 MethodChannel 方案,适用于页面跳转场景。如果需要将地图嵌入 Flutter 页面中,请参考下篇《PlatformView 同层渲染方案》。

下一篇预告:[高德地图集成 - 同层渲染方案](https://gitee.com/zacks/awesome-harmonyos-flutter/blob/master/鸿蒙 Flutter 实战:20-PlatformView 同层渲染集成高德地图.md)

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!


相关资源

源码地址

本文参考源码:https://atomgit.com/zacksleo/flutter-ohos-demo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少湖说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值