Flutter 与 OpenHarmony 通信:Flutter Channel 使用指南

Flutter 与 OpenHarmony 通信:Flutter Channel 使用指南

欢迎大家加入跨平台社区

本文介绍在 Flutter OpenHarmony 化工程中,如何利用 Flutter Channel 实现 Dart 代码与 OpenHarmony 原生端(ETS)之间的通信。Flutter Channel 提供了灵活的消息传递机制,支持方法调用、基础消息通信和事件流三种常用模式。以下将分别说明其使用方法,并附上关键代码示例。

完整示例可参考 channel_demo


1. MethodChannel(方法调用)

MethodChannel 用于调用平台提供的特定方法,并支持异步返回结果。

Dart 端代码
dart 复制代码
// 创建 MethodChannel 实例
final _platform = const MethodChannel('samples.flutter.dev/battery');

// 调用原生端方法 getBatteryLevel
final result = await _platform.invokeMethod<int>('getBatteryLevel');
ETS 端代码
typescript 复制代码
onAttachedToEngine(binding: FlutterPluginBinding): void {
    let that = this;
    // 创建 MethodChannel 实例
    this.channel = new MethodChannel(binding.getBinaryMessenger(), "samples.flutter.dev/battery");
    
    // 设置方法调用处理器
    this.channel.setMethodCallHandler({
        onMethodCall(call: MethodCall, result: MethodResult) {
            switch (call.method) {
                case "getBatteryLevel":
                    that.api.getBatteryLevel(result);
                    break;
                default:
                    result.notImplemented();
                    break;
            }
        }
    });
}

2. BasicMessageChannel(基础消息通信)

BasicMessageChannel 用于简单的数据传递,支持双向异步消息收发。

Dart 端代码
dart 复制代码
int count = 0;

// 创建 BasicMessageChannel 实例
final _basicChannel = const BasicMessageChannel(
    "samples.flutter.dev/basic_channel", 
    StandardMessageCodec()
);

// 发送消息并接收回复
String result = await _basicChannel.send(++count) as String;
ETS 端代码
typescript 复制代码
onAttachedToEngine(binding: FlutterPluginBinding): void {
    // 创建 BasicMessageChannel 实例
    this.basicChannel = new BasicMessageChannel(
        binding.getBinaryMessenger(), 
        "samples.flutter.dev/basic_channel", 
        new StandardMessageCodec()
    );
    
    // 设置消息处理器
    this.basicChannel.setMessageHandler({
        onMessage(message: Any, reply: Reply<Any>) {
            Log.i(TAG, "message=" + message);
            if (message % 2 == 0) {
                reply.reply("run with if case.");
            } else {
                reply.reply("run with else case");
            }
        }
    });
}

3. EventChannel(事件流通信)

EventChannel 用于从原生端向 Dart 端发送连续的事件流,适用于状态监听、实时数据推送等场景。

Dart 端代码
dart 复制代码
// 创建 EventChannel 实例
final _eventChannel = const EventChannel('samples.flutter.dev/event_channel');

// 监听事件流
_eventChannel.receiveBroadcastStream().listen((event) {
    setState(() {
        message = "EventChannel event=$event";
    });
});
ETS 端代码
typescript 复制代码
private eventSink?: EventSink;

onAttachedToEngine(binding: FlutterPluginBinding): void {
    let that = this;
    
    // 创建 EventChannel 实例
    this.eventChannel = new EventChannel(
        binding.getBinaryMessenger(), 
        "samples.flutter.dev/event_channel"
    );
    
    // 设置流处理器
    this.eventChannel.setStreamHandler({
        onListen(args: Any, events: EventSink): void {
            that.eventSink = events;
            Log.i(TAG, "onListen: " + args);
        },
        onCancel(args: Any): void {
            that.eventSink = undefined;
            Log.i(TAG, "onCancel: " + args);
        }
    });
}

// 通过 EventSink 发送事件到 Dart 端
that.eventSink?.success("Success at " + new Date());

总结

通过上述三种 Channel,你可以灵活实现 Flutter 与 OpenHarmony 平台之间的双向通信:

  • MethodChannel:适用于调用特定平台功能并获取返回结果。
  • BasicMessageChannel:适用于简单的异步数据交换。
  • EventChannel:适用于平台向 Flutter 持续推送事件的场景。

在实际开发中,建议根据通信需求选择合适的 Channel 类型,并注意处理好通信过程中的异常与生命周期管理。

如果遇到问题,欢迎在评论区交流讨论。

相关推荐
默_笙4 小时前
🚤 CSS 布局的"圈地运动":BFC 就是浏览器的独立领地
前端·javascript
我爱写代码i4 小时前
AI对话绘画数字人源码 - uniapp前端
前端·人工智能·uni-app
OpenTiny社区5 小时前
太酷了!装上OpenTiny dsh‑genui这个插件,你的DeepSeek Harness点击就能干活了!
前端·ai编程
用户938515635075 小时前
大模型记忆指南:从短时缓存到永久记忆,手把手带你吃透 LangChain Memory 管理
javascript·人工智能
ModyQyW5 小时前
vite-plugin-uni-pages 更新了什么
前端·uni-app
末代iOS程序员华仔5 小时前
iOS 5.6 条例解决方法
flutter·ios·swift
xqchen5 小时前
Web Components 普及困境深度解析:技术标准与工程实践的落差
javascript
爱丶不疚5 小时前
写给前端工程师的现代 Python 工程化最佳实践:从 pnpm 到 uv,从 CommonJS 到 src-layout
javascript·python·typescript
前端大卫5 小时前
H5 渲染 PDF 并添加高亮的两种方案【附源码】
前端
因_崔斯汀6 小时前
用 AI 生成 Three.js 沉浸式网站,代码与 Skill 均已开源
前端·人工智能