当前位置: 首页 > news >正文

九、平台相关

目录

  • 1. 如何调用平台原生代码?
  • 2. 什么是 Platform Channel?
  • 3. 如何实现 Flutter 与原生之间的数据传递?
  • 4. 如何在 Flutter 中使用原生视图?

1. 如何调用平台原生代码?

通过 Platform Channel 实现

  1. 创建 MethodChannel(在 Flutter 中):
const channel = MethodChannel('com.example/native_channel');
  1. 调用原生方法(Flutter → 原生):
final String result = await channel.invokeMethod('getBatteryLevel');
  1. 原生端实现(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()}}
}
  1. 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:基础数据传递(较少用)。
  • 数据格式:支持可序列化的数据类型(如字符串、列表、字典)。
  • 通信原理
MethodCall
Response
Flutter
Platform Channel
Android/iOS

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):

  • 步骤
  1. 原生端注册视图(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())
  1. 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 ChannelMethodChannel
数据传递(双向)MethodChannelinvokeMethod
数据流(单向)EventChannelStream
嵌入原生视图PlatformViewAndroidView/UiKitView

通过 Platform Channel 机制,Flutter 实现了与原生平台的安全、高效通信,满足复杂功能需求。

http://www.lryc.cn/news/579920.html

相关文章:

  • Rust实战:生成酷炫链接相关玩法
  • 创客匠人创始人IP方法论:打破行业内卷的价值竞争路径
  • 商业秘密保卫战:客户信息保护的证据攻防之道
  • 版本控制器SVN
  • 棱光 PDF 工具箱:水印管理 + 格式转换 + 批量处理提升效率
  • Android View的绘制原理详解
  • 怎么限制某些IP访问服务器?
  • 基于AR和SLAM技术的商场智能导视系统技术原理详解
  • 基于dropbear实现嵌入式系统ssh服务端与客户端完整交互
  • 适用于 vue2、vue3 的自定义指定:v-int(正整数)
  • HDMI延长器 vs 分配器 vs KVM切换器 vs 矩阵:技术区别与应用场景
  • Django+DRF 实战:从异常捕获到自定义错误信息
  • VS中将cuda项目编译为DLL并调用
  • Excel 如何处理更复杂的嵌套逻辑判断?
  • Java并发性能优化|读写锁与互斥锁解析
  • openEuler 24.03 全流程实战:用 Ansible 5 分钟部署分布式 MinIO 高可用集群
  • 分布式集合通信--学习笔记
  • Data的时区格式BUG
  • 4 位量化 + FP8 混合精度:ERNIE-4.5-0.3B-Paddle本地部署,重新定义端侧推理效率
  • 【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之高斯椭球的颜色表达
  • 替代MT6701,3D 霍尔磁性角度传感器芯片
  • Python 机器学习核心入门与实战进阶 Day 2 - KNN(K-近邻算法)分类实战与调参
  • PyTorch实战(14)——条件生成对抗网络(conditional GAN,cGAN)
  • vue-39(为复杂 Vue 组件编写单元测试)
  • MySQL分布式ID冲突详解:场景、原因与解决方案
  • FFmpeg、WebAssembly 和 WebGL 在 Web 端的结合应用
  • GO 语言学习 之 结构体
  • 【深度学习新浪潮】如何使用大模型等技术基于序列预测蛋白质的结构,功能和靶点?
  • 韩顺平之第九章综合练习-----------房屋出租管理系统
  • hive中2种常用的join方式