ITPub博客

首页 > 数据库 > 数据库开发技术 > 如何使用Flutter与OpenHarmony通信 FlutterChannel

如何使用Flutter与OpenHarmony通信 FlutterChannel

数据库开发技术 作者:像素工程师 时间:2026-03-18 08:48:06 0 删除 编辑

本文介绍在Flutter OpenHarmony化工程中,如何使用 Flutter Channel 能力。

FlutterChannel介绍

FlutterChannel是Flutter 与OpenHarmony原生层之间进行通信的核心机制,它提供了三种不同类型 的通信通道,满足各种跨平台通信需求。通过FlutterChannel,开发者可以在Flutter代码中调用 OpenHarmony原生APl,也可以在原生代码中触发Flutter端的回调。

三种通信通道

1. MethodChannel:用于方法调用,支持Flutter和原生之间的双向方法调用,比如调用相机、电池电量等。

2.BasicMessageChannel:用于基本消息传递,支持字符串、二进制等数据的双向传递

3.EventChannel:用于事件流通信,支持原生向Flutter发送事件通知

三种方式,关键实现代码,完整的demo请参考 channel_demo。

MethodChannel

dart代码:

// 创建实例
final _platform = const MethodChannel('samples.flutter.dev/battery');
// 调用方法 getBatteryLevel
final result = await _platform.invokeMethod<int>('getBatteryLevel');

ets代码:

onAttachedToEngine(binding: FlutterPluginBinding): void {
    let that = this;
    // 创建实例
    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;
        }
        }
    })
}

BasicMessageChannel

dart代码:

int count = 0;
// 创建实例
final _basicChannel = const BasicMessageChannel(
      "samples.flutter.dev/basic_channel", StandardMessageCodec());
// 调用方法,获取平台侧的返回值
String result = await _basicChannel.send(++count) as String;

ets代码:

onAttachedToEngine(binding: FlutterPluginBinding): void {
    // 创建实例
    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");
        }
        }
    })
}

EventChannel

dart代码:

// 创建实例
final _eventChannel = const EventChannel('samples.flutter.dev/event_channel');
// 注册事件监听
_eventChannel.receiveBroadcastStream().listen((event) {
    setState(() {
        message = "EventChannel event=$event";
    });
});

ets代码:

private eventSink?: EventSink;

onAttachedToEngine(binding: FlutterPluginBinding): void {
    let that = this;
    // 创建实例
    this.eventChannel = new EventChannel(binding.getBinaryMessenger(), "samples.flutter.dev/event_channel");
    // 设置回调,获取EventSink
    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());

总结

FlutterChannel提供了强大的跨平台通信能力,通过三种不同类 型的通道满足各种通信需求:

1. MethodChannel:适用于需要双向方法调用的场景,如获取设备信息、调用原生API等

2.BasicMessageChannel:适用于需要频繁传递数据的场景,如字符串、二进制数据等

3.EventChannel:适用于需要原生向Flutter发送事件通知的场景,如传感器数据、状态变化等

使用FlutterChannel的基本步骤:

1. 在Flutter和OpenHarmony两端创建相同名称的Channel实例

2.在两端分别设置消息/方法处理器

3.通过Channel发送消息或调用方法

4.处理接收到的消息或方法调用

原文作者:;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2019-05-09

  • 博文量
    11
  • 访问量
    527