1️⃣ MethodChannel(请求-响应模型)

异步请求形式,通信模型如下:

Flutter  → invokeMethod() →  Native
Flutter  ← result.success() ← Native

Flutter代码

const channel = MethodChannel("demo");
final result = await channel.invokeMethod("getBattery");

Native的iOS端

channel.setMethodCallHandler { call, result in
    if call.method == "getBattery" {
        result(80)
    }
}

2️⃣ EventChannel(流式数据)

适合:

  • 传感器数据
  • 定位更新
  • 下载进度
  • 监听系统状态

单向流:NativeFlutter,通信模型如下:

Native → EventSink → Flutter Stream

在Flutter端只管接收即可

const eventChannel = EventChannel("demo_event");
eventChannel.receiveBroadcastStream().listen((event) {
  print(event);
});

3️⃣ BasicMessageChannel(双向消息)

最底层、最灵活!适合:

  • 自定义协议
  • 双向频繁通信
  • 纯文本、JSON 或 binary 数据

通信模型

Flutter  ←──────────────→  Native
        BasicMessageChannel

flutter端代码

static const channel = BasicMessageChannel<String>("basic_demo", StringCodec());

  Future<void> sendMessage() async {
    final response = await channel.send(controller.text);
    setState(() {
      result = response ?? "No response";
    });
  }

  
  void initState() {
    super.initState();

    // 监听 Native 主动发来的消息
    channel.setMessageHandler((message) async {
      return "Flutter received: $message";
    });
  }

Native端,以iOS的Swift举例子

import Flutter

func registerBasicChannel(engine: FlutterEngine) {

    let channel = FlutterBasicMessageChannel(
        name: "basic_demo",
        binaryMessenger: engine.binaryMessenger,
        codec: FlutterStringCodec.sharedInstance()
    )

    channel.setMessageHandler { message, reply in

        if let text = message as? String {
            let processed = text.uppercased()
            reply(processed) // 单条消息回复
        } else {
            reply("Invalid message")
        }
    }

    // 也可以 Native 主动发消息到Flutter
    DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
        channel.sendMessage("Hello from Native")
    }
}
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐