一文精通-Flutter 与原生(Android/iOS)通信

Flutter 与原生(Android/iOS)通信主要依靠 Platform Channel 机制,以下是三种基本通信方式及其使用场景,附代码示例:


一、MethodChannel(方法通道)

用途双向通信 ,用于 Flutter 与原生之间调用对方的方法(如调用原生 API 或传递计算结果)。
场景:获取设备信息、调用相机/传感器、支付功能等需要主动触发原生能力的场景。

代码示例:

dart 复制代码
// Flutter 端(Dart)
import 'package:flutter/services.dart';

final methodChannel = MethodChannel('com.example/app');

// 调用原生方法获取电池电量
Future<int> getBatteryLevel() async {
  try {
    final result = await methodChannel.invokeMethod('getBatteryLevel');
    return result as int;
  } on PlatformException catch (e) {
    print("Error: ${e.message}");
    return -1;
  }
}
kotlin 复制代码
// Android 端(Kotlin)
class MainActivity : FlutterActivity() {
    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "com.example/app").setMethodCallHandler { call, result ->
            if (call.method == "getBatteryLevel") {
                val batteryLevel = getBatteryLevel()
                result.success(batteryLevel)
            } else {
                result.notImplemented()
            }
        }
    }

    private fun getBatteryLevel(): Int {
        // 实现获取电量逻辑
    }
}
swift 复制代码
// iOS 端(Swift)
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        let controller = window?.rootViewController as! FlutterViewController
        let channel = FlutterMethodChannel(name: "com.example/app", binaryMessenger: controller.binaryMessenger)
        channel.setMethodCallHandler { call, result in
            if call.method == "getBatteryLevel" {
                self.getBatteryLevel(result: result)
            } else {
                result(FlutterMethodNotImplemented)
            }
        }
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }

    private func getBatteryLevel(result: FlutterResult) {
        // 实现获取电量逻辑
    }
}

二、EventChannel(事件通道)

用途单向数据流 ,用于原生向 Flutter 持续发送事件(如传感器数据、网络状态变化)。
场景:实时监听传感器数据、网络连接状态、推送通知等流式数据场景。

代码示例:

csharp 复制代码
// Flutter 端(Dart)
final eventChannel = EventChannel('com.example/events');

Stream<int> listenToTimer() {
  return eventChannel.receiveBroadcastStream().map((event) => event as int);
}

// 使用:StreamBuilder 监听数据
kotlin 复制代码
// Android 端(Kotlin)
class MainActivity : FlutterActivity() {
    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        EventChannel(flutterEngine.dartExecutor.binaryMessenger, "com.example/events").setStreamHandler(
            object : StreamHandler {
                var eventSink: EventChannel.EventSink? = null
                var timer: Timer? = null

                override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
                    eventSink = events
                    timer = Timer().scheduleAtFixedRate(1000, 1000) {
                        eventSink?.success(System.currentTimeMillis())
                    }
                }

                override fun onCancel(arguments: Any?) {
                    timer?.cancel()
                    eventSink = null
                }
            }
        )
    }
}
swift 复制代码
// iOS 端(Swift)
class EventHandler: NSObject, FlutterStreamHandler {
    var eventSink: FlutterEventSink?
    var timer: Timer?

    func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? {
        self.eventSink = events
        timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
            events(Int(Date().timeIntervalSince1970))
        }
        return nil
    }

    func onCancel(withArguments arguments: Any?) -> FlutterError? {
        timer?.invalidate()
        eventSink = nil
        return nil
    }
}

// AppDelegate 中注册
let eventChannel = FlutterEventChannel(name: "com.example/events", binaryMessenger: controller.binaryMessenger)
eventChannel.setStreamHandler(EventHandler())

三、BasicMessageChannel(基础消息通道)

用途简单数据传递 ,支持双向通信,适合传递基本数据类型(String/Map)。
场景:轻量级数据交换(如用户配置同步、简单文本传输)。

代码示例:

dart 复制代码
// Flutter 端(Dart)
final messageChannel = BasicMessageChannel<String>('com.example/messages', StringCodec());

// 发送消息
messageChannel.send('Hello from Flutter').then((reply) {
  print('Received reply: $reply');
});

// 设置消息处理器
messageChannel.setMessageHandler((message) async {
  return 'Received: $message';
});
rust 复制代码
// Android 端(Kotlin)
BasicMessageChannel<String>(flutterEngine.dartExecutor.binaryMessenger, "com.example/messages", StringCodec.INSTANCE).apply {
    setMessageHandler { message, reply ->
        reply.reply("Android received: $message")
    }
}
less 复制代码
// iOS 端(Swift)
let messageChannel = FlutterBasicMessageChannel(
    name: "com.example/messages",
    binaryMessenger: controller.binaryMessenger,
    codec: FlutterStringCodec.sharedInstance()
)
messageChannel.setMessageHandler { message, reply in
    reply("iOS received: (message ?? "")")
}

对比总结

通道类型 通信方向 数据流特点 典型场景
MethodChannel 双向 单次方法调用与响应 调用原生 API、获取设备信息
EventChannel 原生 → Flutter 持续事件流 传感器监听、实时数据更新
BasicMessage 双向 简单数据传递 轻量级配置同步、文本交互

根据具体需求选择通道类型,确保数据高效传递并减少性能损耗。

相关推荐
yoke菜籽22 分钟前
面试150——二叉树
面试·职场和发展
程序员小寒36 分钟前
前端高频面试题之Vuex篇
前端·javascript·面试
GISer_Jing42 分钟前
跨平台Hybrid App开发实战指南
android·flutter·react native
程序员爱钓鱼2 小时前
Python 编程实战 · 实用工具与库 — Django 项目结构简介
后端·python·面试
许强0xq11 小时前
Q3: create 和 create2 有什么区别?
面试·web3·区块链·智能合约·solidity·dapp·evm
han_12 小时前
前端高频面试题之Vuex篇
前端·vue.js·面试
猫林老师12 小时前
Flutter for HarmonyOS开发指南(八):国际化与本地化深度实践
flutter·华为·harmonyos
被瞧不起的神12 小时前
校招面经(一)入门篇
面试
hygge99915 小时前
JVM GC 垃圾回收体系完整讲解
java·开发语言·jvm·经验分享·面试
hygge99915 小时前
MySQL 全体系深度解析(存储引擎、事务、日志、MVCC、锁、索引、执行计划、复制、调优)
数据库·经验分享·mysql·adb·面试