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

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

相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万3 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋3 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁3 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄3 天前
JavaScript 隐式全局变量解析
javascript
汉堡大王95273 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大3 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师3 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端