九、平台相关
目录
- 1. 如何调用平台原生代码?
- 2. 什么是 Platform Channel?
- 3. 如何实现 Flutter 与原生之间的数据传递?
- 4. 如何在 Flutter 中使用原生视图?
1. 如何调用平台原生代码?
通过 Platform Channel 实现:
- 创建 MethodChannel(在 Flutter 中):
const channel = MethodChannel('com.example/native_channel');
- 调用原生方法(Flutter → 原生):
final String result = await channel.invokeMethod('getBatteryLevel');
- 原生端实现(Android 示例):
override fun configureFlutterEngine(engine: FlutterEngine) {MethodChannel(engine.dartExecutor, "com.example/native_channel").setMethodCallHandler { call, result ->if (call.method == "getBatteryLevel") {val batteryLevel = getBatteryLevelFromSystem()result.success(batteryLevel)} else {result.notImplemented()}}
}
- iOS 端实现(Swift 示例):
let controller = window.rootViewController as! FlutterViewController
let channel = FlutterMethodChannel(name: "com.example/native_channel", binaryMessenger: controller.binaryMessenger)
channel.setMethodCallHandler { call, result inif call.method == "getBatteryLevel" {let level = self.getBatteryLevelFromSystem()result(level)} else {result(FlutterMethodNotImplemented)}}
2. 什么是 Platform Channel?
核心概念:
- 定义:Flutter 提供的与 Android/iOS 原生代码通信的桥梁。
- 三种类型:
- MethodChannel:双向方法调用(最常用)。
- EventChannel:原生到 Flutter 的单向事件流(如传感器数据)。
- BasicMessageChannel:基础数据传递(较少用)。
- 数据格式:支持可序列化的数据类型(如字符串、列表、字典)。
- 通信原理:
3. 如何实现 Flutter 与原生之间的数据传递?
方法一:MethodChannel(双向通信)
- Flutter → 原生:
final String response = await channel.invokeMethod('methodName', {'key': 'value'});
- 原生 → Flutter:通过
**result.success(data)**
或**result.error()**
返回数据。
方法二:EventChannel(单向数据流)
- Flutter 端:
const eventChannel = EventChannel('com.example/events');
final stream = eventChannel.receiveBroadcastStream();
stream.listen((data) { print(data); });
- 原生端(Android):
EventChannel(engine.dartExecutor, "com.example/events").setStreamHandler(object : StreamHandler {override fun onListen(args: Any?, sink: EventSink) {// 向 sink 发送数据:sink.success("Data")}override fun onCancel(args: Any?) {}}
)
数据格式限制:
- 支持类型:
null
、布尔值、数字、字符串、字节数组、列表、字典。 - 复杂对象需序列化(如 JSON)。
4. 如何在 Flutter 中使用原生视图?
使用 PlatformView(AndroidView / UiKitView):
- 步骤:
- 原生端注册视图(Android 示例):
class NativeViewFactory : PlatformViewFactory(StandardMessageCodec.INSTANCE) {override fun create(context: Context, id: Int, args: Any?): PlatformView {return CustomNativeView(context)}
}
// 在 FlutterPlugin 中注册:
registrar.platformViewRegistry().registerViewFactory("native_view", NativeViewFactory())
- Flutter 端嵌入视图:
Widget build(BuildContext context) {if (Platform.isAndroid) {return AndroidView(viewType: 'native_view',creationParams: {'text': 'Hello Native'},creationParamsCodec: StandardMessageCodec(),);} else if (Platform.isIOS) {return UiKitView(viewType: 'native_view',creationParams: {'text': 'Hello Native'},creationParamsCodec: StandardMessageCodec(),);}return Text('Unsupported platform');
}
注意事项:
- 性能:原生视图有渲染开销,避免高频更新。
- 平台差异:Android 和 iOS 需分别实现视图逻辑。
- 版本要求:需 Flutter 1.22+(旧版 Android 使用
**Hybrid Composition**
模式)。
总结
功能 | 实现方式 | 关键组件 |
---|---|---|
调用原生代码 | Platform Channel | MethodChannel |
数据传递(双向) | MethodChannel | invokeMethod |
数据流(单向) | EventChannel | Stream |
嵌入原生视图 | PlatformView | AndroidView /UiKitView |
通过 Platform Channel 机制,Flutter 实现了与原生平台的安全、高效通信,满足复杂功能需求。