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 类型,并注意处理好通信过程中的异常与生命周期管理。

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

相关推荐
我命由我123453 小时前
CesiumJS 笔记 - 获取容器中心点、Cartesian3 clone 方法、修改 Cartesian3 对象的高度
前端·javascript·css·前端框架·html·html5·js
Hopebearer_4 小时前
页面突然只剩 DOM?一次静态资源版本错配排查
前端·部署
抱抱宝4 小时前
Agent-study项目教程(03):手写 Mini-ReAct Agent(不依赖框架)
javascript·人工智能·gpt·react.js·prompt·agent
东风破_5 小时前
ESLint 是什么?为什么你的项目需要它?
前端·后端·代码规范
用户938515635075 小时前
Next.js 笔记系统(二):Redis 数据服务与侧边栏组件拆分实战
javascript·全栈
圣殿骑士-Khtangc6 小时前
Go字符串高效拼接性能对比与底层原理分析
服务器·前端·golang
BigTopOne7 小时前
【ijkplayer】 硬解码流程
前端
kyriewen8 小时前
DeepSeek Harness开源第一天我就上手了——和Claude Code的差距比想象中大
前端·ai编程·deepseek
捡田螺的小男孩8 小时前
什么是 Skill?手把手带你写一个简单有用的 Skill!
前端·后端·程序员
IT_陈寒8 小时前
Redis集群这个坑,差点让我通宵
前端·人工智能·后端