10-Flutter调用鸿蒙原生能力前置课:MethodChannel和PlatformView准备

10. Flutter调用鸿蒙原生能力前置课:MethodChannel和PlatformView准备

当 Flutter 页面需要调用鸿蒙系统能力、复用 ArkTS 组件或嵌入原生视图时,就要进入 Flutter 与鸿蒙原生交互。正式写插件前,先把 MethodChannel、PlatformView、参数传递和目录位置弄清楚。

两种常见交互方式

MethodChannel 适合方法调用,例如获取原生计算结果、读取系统信息、调用鸿蒙能力。PlatformView 适合视图嵌入,例如把鸿蒙原生 Swiper、地图、播放器或已有 ArkTS 页面局部嵌入 Flutter 页面。

text 复制代码
MethodChannel:Flutter 发起方法调用 -> ArkTS 执行 -> 返回结果
PlatformView:Flutter 预留视图区域 -> 鸿蒙侧创建原生视图 -> 嵌入显示

Flutter 侧 MethodChannel

dart 复制代码
import 'package:flutter/services.dart';

class NativeBridge {
  static const MethodChannel _channel =
      MethodChannel('demo/native_channel');

  static Future<int> add(int a, int b) async {
    final result = await _channel.invokeMethod<int>('add', {
      'a': a,
      'b': b,
    });
    return result ?? 0;
  }

  static Future<String> getDeviceName() async {
    final result = await _channel.invokeMethod<String>('getDeviceName');
    return result ?? '';
  }
}

页面调用:

dart 复制代码
final sum = await NativeBridge.add(10, 20);
final deviceName = await NativeBridge.getDeviceName();

鸿蒙侧目录规划

text 复制代码
ohos/entry/src/main/ets
├─ entryability
│  └─ EntryAbility.ets
└─ plugins
   ├─ NativeBridgePlugin.ets
   └─ NativeViewFactory.ets

EntryAbility.ets 负责生命周期和插件注册,plugins 目录放具体插件逻辑。不要把所有逻辑都写进 EntryAbility,否则后面方法变多会很难维护。

参数设计

通道参数尽量使用简单 JSON 类型:字符串、数字、布尔值、数组、对象。Flutter 侧和鸿蒙侧字段名要固定,例如:

dart 复制代码
await _channel.invokeMethod('openPage', {
  'pageName': 'detail',
  'id': 1001,
  'readonly': true,
});

字段名确定后不要随意修改,否则 Flutter 调用和 ArkTS 解析很容易对不上。

PlatformView 准备

Flutter 侧可以先封装一个 Widget,业务页面只使用这个 Widget:

dart 复制代码
class NativeSwiperBox extends StatelessWidget {
  const NativeSwiperBox({super.key});

  @override
  Widget build(BuildContext context) {
    return const SizedBox(
      height: 220,
      child: OhosView(
        viewType: 'demo/native_swiper',
        creationParams: {
          'autoplay': true,
          'interval': 3000,
        },
        creationParamsCodec: StandardMessageCodec(),
      ),
    );
  }
}

具体平台视图类名要以项目当前 Flutter OpenHarmony 版本提供的 API 为准。如果项目中已经做过二次封装,业务页面优先使用封装后的组件。

桥接检查

正式写原生交互前先核对:

text 复制代码
[ ] 通道名称固定且唯一
[ ] 方法名使用常量或集中管理
[ ] 参数字段有明确类型
[ ] Flutter 侧处理异常
[ ] 鸿蒙侧处理缺失参数
[ ] 插件注册位置清楚
[ ] 原生视图 viewType 与 Flutter 侧一致

这些准备做好后,就可以继续扩展到 Flutter 调用鸿蒙原生组件、Flutter 嵌入鸿蒙原生 Swiper、Flutter 与鸿蒙原生互相传参等实战内容。

通道命名规范

通道名称要像包名一样稳定:

text 复制代码
com.example.demo/native_channel
com.example.demo/native_swiper

不要用 test、demo、channel1 这种临时名称。通道名一旦写进 Flutter 和 ArkTS 两端,后续随意修改就会导致调用失败。

异常处理不能省

Flutter 侧调用原生能力时要处理异常:

dart 复制代码
try {
  final value = await NativeBridge.add(1, 2);
  debugPrint('native result: $value');
} on PlatformException catch (e) {
  debugPrint('native error: ${e.code}, ${e.message}');
} catch (e) {
  debugPrint('unknown error: $e');
}

鸿蒙侧也要对缺失参数、类型错误、未知方法给出明确返回。桥接代码最怕静默失败,调用方不知道是没注册、方法名错了,还是参数解析失败。

e}, ${e.message}');

} catch (e) {

debugPrint('unknown error: $e');

}

复制代码
鸿蒙侧也要对缺失参数、类型错误、未知方法给出明确返回。桥接代码最怕静默失败,调用方不知道是没注册、方法名错了,还是参数解析失败。
相关推荐
垆边人似月.1 小时前
华为机试题 :和为 K 的子数组个数
算法·leetcode·华为
gjf05_052 小时前
人该怎样活着呢?版本75.8
学习
li星野4 小时前
【学习记录】PCB与PCBA核心知识全解析:从设计到制造的关键细节
学习·制造
卿卿的产品经理日记4 小时前
【AI产品经理实战】Day 35|从“沉迷工具“到回归 AI 底层:Skill 收官、系统复盘与下一个 13 天
人工智能·学习·产品经理
一条泥憨鱼5 小时前
【从0开始学习计算机网络】| ARP 协议:地址解析,ARP 欺骗,链路层寻址
网络·后端·学习·计算机网络
程序猿追5 小时前
一次右尾概率实验:statrs4cj 的 CJMP 鸿蒙接入与双端实测
华为·harmonyos
大龄秃头程序员5 小时前
Riverpod 深度解析:从响应式本质到最小可运行闭环
flutter
HY小宝F5 小时前
树莓派智能摄像头系统 30 天重学计划之 Day 04 · HTTP / API:控制链入口 —— 学习总结
网络协议·学习·http
大雷神6 小时前
从一道24点到同屏双人派对:用鸿蒙开发助手起步,复用已有App开发手机元服务
华为·智能手机·harmonyos
song5016 小时前
React Native for OpenHarmony 实战:三方库 react-native-parallax-scroll-view 的鸿蒙化适配指南
分布式·react native·react.js·transformer·harmonyos