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

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

相关推荐
是上好佳佳佳呀8 分钟前
【前端(十一)】JavaScript 语法基础笔记(多语言对比)
前端·javascript·笔记
莎士比亚的文学花园14 分钟前
Linux驱动开发(3)——设备树
开发语言·javascript·ecmascript
xmdy586628 分钟前
Flutter+开源鸿蒙实战|智安盾电商溯源平台Day1 项目搭建与整体方案拆解
flutter·开源·harmonyos
CDN36041 分钟前
排查实录:网站偶发502/504错误?360CDN回源超时配置与日志分析技巧
前端·数据库
之歆1 小时前
Day07_CSS盒子模型 · 样式继承 · 用户代理样式
前端·css
01漫游者1 小时前
JavaScript函数与对象增强知识
开发语言·javascript·ecmascript
DanCheOo1 小时前
AI 应用的安全架构:Prompt 注入、数据泄露、权限边界
前端·人工智能·prompt·安全架构
We་ct2 小时前
深度剖析浏览器跨域问题
开发语言·前端·浏览器·跨域·cors·同源·浏览器跨域
weixin_427771613 小时前
前端调试隐藏元素
前端
threelab3 小时前
Three.js 代码云效果 | 三维可视化 / AI 提示词
开发语言·javascript·人工智能