Flutter 与 Android 的互通几种方式

Flutter 与 Android 的互通主要通过以下几种方式实现,每种方式适用于不同的场景:


1. 平台通道(Platform Channels)

Flutter 与原生 Android 代码通信的核心方式,支持双向调用。

类型
  • MethodChannel:双向方法调用(最常用)
  • EventChannel:用于原生向 Flutter 发送事件流(如传感器数据)
  • BasicMessageChannel:简单的消息传递(较少使用)
示例(MethodChannel)
// Flutter 侧(Dart)
const channel = MethodChannel('com.example/app');
Future<void> getNativeData() async {try {final String result = await channel.invokeMethod('getData');print('原生返回: $result');} on PlatformException catch (e) {print('调用失败: ${e.message}');}
}
// 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 == "getData") {result.success("Hello from Android!")} else {result.notImplemented()}}}
}

2. 插件(Plugins)

封装原生功能的可复用模块,社区或官方提供(如相机、定位等)。

使用步骤
  1. 添加依赖pubspec.yaml):
    dependencies:url_launcher: ^6.0.0
    
  2. 调用插件
    import 'package:url_launcher/url_launcher.dart';
    Future<void> launchURL() async {if (await canLaunch('https://flutter.dev')) {await launch('https://flutter.dev');}
    }
    
自定义插件

通过 flutter create --template=plugin 生成插件模板,自动生成平台通道代码。


3. 平台视图(Platform Views)

在 Flutter 中嵌入原生 Android 控件(如 WebView、地图)。

示例(嵌入 Android View)
// Flutter 侧
Widget build(BuildContext context) {return AndroidView(viewType: 'native_view',creationParams: {'text': 'Flutter传递的参数'},creationParamsCodec: StandardMessageCodec(),);
}
// Android 侧注册视图
class NativeViewFactory : PlatformViewFactory(StandardMessageCodec.INSTANCE) {override fun create(context: Context, id: Int, args: Any?): PlatformView {val params = args as Map<String, Any>return NativeView(context, params["text"] as String)}
}// 在 FlutterActivity 中注册
flutterEngine.platformViewsController.registry.registerViewFactory("native_view", NativeViewFactory()
)

4. 直接调用原生 Activity/Service

从 Flutter 启动 Android 原生页面或服务。

示例
// Flutter 侧
const channel = MethodChannel('com.example/activity');
Future<void> startNativeActivity() async {await channel.invokeMethod('startVideoPlayer', {'url': 'video.mp4'});
}
// Android 侧
MethodChannel(flutterEngine.dartExecutor, "com.example/activity").setMethodCallHandler { call, result ->if (call.method == "startVideoPlayer") {val url = call.argument<String>("url")val intent = Intent(this, VideoPlayerActivity::class.java).apply {putExtra("videoUrl", url)}startActivity(intent)result.success(null)}
}

5. 数据共享

通过共享存储(如 SharedPreferences、数据库)传递数据。

示例(SharedPreferences)
// Flutter 侧
final prefs = await SharedPreferences.getInstance();
await prefs.setString('token', 'abc123');
// Android 侧读取(同一文件)
val prefs = getSharedPreferences("FlutterSharedPreferences", MODE_PRIVATE)
val token = prefs.getString("flutter.token", "") // 注意键名前缀 `flutter.`

6. FFI(Foreign Function Interface)

直接调用 C/C++ 代码(通过 dart:ffi),适用于高性能计算或底层操作。

适用场景
  • 调用现有的 C/C++ 库。
  • 需要极致性能的模块(如图像处理)。

如何选择?

场景推荐方式
简单方法调用MethodChannel
持续事件监听(如传感器)EventChannel
复用社区功能(如相机)Plugins
嵌入复杂原生控件Platform Views
启动原生页面调用 Activity/Service
共享简单数据SharedPreferences
高性能原生代码交互FFI

注意事项

  1. 线程问题:原生代码默认在 UI 线程执行,耗时操作需切换到子线程。
  2. 异步处理:Flutter 侧使用 Future,原生侧需调用 result.success()result.error()
  3. 性能:频繁跨平台通信可能影响性能,尽量批量传递数据。

通过合理选择这些方式,可以无缝结合 Flutter 的跨平台优势与 Android 的原生能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/913949.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全新开源AI知识库系统!PandaWiki一键构建智能文档,支持AI问答、创作与搜索!

传统 Wiki 工具像一本厚重的“死书”&#xff0c;虽能存储信息&#xff0c;却无法主动「思考」。而在当今AI席卷各个行业的浪潮中&#xff0c;知识管理也迎来了智能化的巨大飞跃。最近开源圈悄然走红的 PandaWiki&#xff0c;就用 AI 大模型为知识库注入了 灵魂&#xff0c; 它…

Rust 结构体

Rust 结构体 引言 Rust 是一种系统编程语言,以其内存安全、并发支持和零成本抽象而闻名。结构体(struct)是 Rust 中用于创建自定义数据类型的工具。本文将深入探讨 Rust 结构体的概念、用法以及其在实际编程中的应用。 结构体的定义 在 Rust 中,结构体是一种复合类型,…

lstm 数据输入问题

lstm 我有 20*6 条数据&#xff0c;20个样本&#xff0c;每个样本6条历史数据&#xff0c;每条数据有5个值&#xff0c;我送给网络输入时应该是20*6*5 还是 6*20*5你的数据是&#xff1a;20 个样本&#xff08;batch size 20&#xff09;每个样本有 6 条历史数据&#xff08;s…

WPF打包exe应用的图标问题

目录 1、WPF打包方法 2、图标问题 1、WPF打包方法 使用Microsoft Visual Studio Installer Projects 2022工具打包&#xff08;成功&#xff09;&#xff0c;需要新建Setup Project项目进行打包 (46 封私信) [C#.net资料]visual studio打包可安装的exe程序(添加配置文件)&am…

Qt中处理多个同类型对象共享槽函数应用

一.Qt中处理多个同类型对象共享槽函数应用场景数字键盘按钮处理动态生成的控件管理工具栏按钮响应游戏中的网格点击处理使用时需特别注意对象生命周期管理和类型安全&#xff0c;现代Qt开发中更推荐使用Lambda表达式替代sender()机制。二.示例1.本文示例功能在ui界面添加5个&am…

康养休闲旅游服务实训室建设方案:理实一体化的产教融合方案

一、康养休闲旅游服务实训室建设方案建设原则对接行业真实场景&#xff1a;实训环境与设备设施严格参照健康咨询、旅行社及相关服务、住宿业、餐饮业等行业的真实职业场景搭建&#xff0c;确保实训项目与岗位工作内容高度匹配&#xff0c;实现工学结合、理实一体化教学。融合前…

微服务架构的演进:迈向云原生——Java技术栈的实践之路

随着云计算技术的快速发展&#xff0c;微服务架构正逐步向云原生&#xff08;Cloud Native&#xff09;演进。云原生不仅是一种技术体系&#xff0c;更是一种开发和运维理念的革新。本文将以Java技术栈为例&#xff0c;结合Kubernetes&#xff08;K8s&#xff09;、服务网格&am…

CVE-2025-32463复现

目录背景知识chroot环境chroot 环境的具体表现Name Service Switch (NSS)机制漏洞简介环境搭建复现POC分析防御方法参考文章&#xff1a;背景知识 chroot环境 &#xff08;全称“change root”&#xff09;是一种Unix/Linux系统中的隔离技术&#xff0c;其核心作用是将进程的…

原生微信小程序研发,如何对图片进行统一管理?

目标&#xff1a; 统一在配置文件中管理图片&#xff0c;用变量存储&#xff0c;换图标时只需修改链接即可&#xff0c;无需更改业务代码&#xff0c;且方便查找。tips: 不建议在 asset 中存储大量图片&#xff0c;原因是官方要求小程序内存要限制在2M以内&#xff0c;图片放多…

Escrcpy(手机投屏) v1.27.2 便携版

Escrcpy 是一款强大的工具&#xff0c;它允许用户通过图形化的 Scrcpy 界面来显示和控制他们的 Android 设备。这款应用程序由 Electron 作为其底层框架驱动。Escrcpy 无需任何账户就可以使用&#xff0c;无需担心隐私或安全问题。Escrcpy没有广告&#xff0c;完全免费开源。软…

element-plus表单校验失败问题

一、问题&#xff1a;做表单校验时&#xff0c;自定义校验和常规校验都失败&#xff0c;自定义校验时无法拿到value值。二、原因&#xff1a;1、变量名称那没有绑定prop。如果是常规校验&#xff0c;没绑定prop的话&#xff0c;在确定按钮时&#xff0c;valid都是true。2、自定…

jmeter做跨线程组

多线程通常会将不同的业务逻辑分配到不同的线程组中。为什么要做多线程&#xff1a;模拟真实世界场景&#xff1a;在实际应用中&#xff0c;服务器通常需要同时处理来自多个用户的请求。通过多线程&#xff0c;JMeter可以模拟这种并发用户的行为&#xff0c;更准确地反映出应用…

SQL实战:多表查询篇

文章目录多表查询创建练习用的数据库链接/连接查询交叉连接自然连接内连接(取交集)外连接左外连接/右外连接自连接子查询联合查询总结数据库的备份和恢复命令行操作多表查询 -- 获得 alice的 部门所在城市 select * from staff where namealice; -- 获得dept_id1 select city …

交通银行基于HarmonyOS数字盾服务,实现大额转账安全

在近日落幕的华为开发者大会2025&#xff08;6月20日-6月22日&#xff09;上&#xff0c;交通银行作为HarmonyOS安全合作的关键伙伴受邀出席。在大会的主题演讲上介绍了交通银行基于HarmonyOS SDK设备安全服务&#xff08;Device Security Kit&#xff09;中的数字盾服务&#…

加密狗硬复制的方法

加密狗硬复制方法概述&#xff1a;Greer82加密狗&#xff08;Dongle&#xff09;是一种硬件加密设备&#xff0c;用于软件版权保护。硬复制是指通过物理手段复制加密狗的硬件信息&#xff0c;通常涉及破解或仿制。需要注意的是&#xff0c;未经授权的复制可能涉及法律风险&…

家庭网络中的服务器怎么对外提供服务?

家庭网络中的服务器怎么对外提供服务&#xff1f;方案1 DDNS&#xff08;家庭网络需要有公网ip&#xff09;方案2 内网穿透&#xff08;需要有一台公网ip的服务器&#xff09;方案1 DDNS&#xff08;家庭网络需要有公网ip&#xff09; 怎么判断是否有公网ip&#xff1f;大致的流…

UnrealEngine5游戏引擎实践(C++)

目录 目录 目录 Unreal Engine 是什么? Unreal Engine 5 简介 核心技术特性 应用场景扩展 兼容性与生态系统 Unreal Engine安装 下载 Epic Games Launcher 启动 Unreal Engine 选择安装版本和路径 选择组件 开始安装 验证安装 配置项目模板(可选) 更新和插件…

web渗透sql注入4之PostgreSQL

web渗透sql注入4之PostgreSQLPostgreSQL数据库特性&#xff1a;基于角色的访问控制&#xff0c;支持超级用户&#xff0c;需安装 plpgsql 扩展方可执行命令&#xff0c;可通过 COPY命令或自定义函数实现权限判断白盒看代码&#xff0c;黑盒通过构造特殊查询语句探测数据库权限权…

2025年7月:打cs1.5 600元装机台式电脑方案A

打cs1.5 600元装机方案A&#xff1a;有需要的小伙伴可以收藏哈&#xff0c;目前我没有机会实测效果&#xff0c;理论值是ok无压力的&#xff0c;大家 有机会配置后的&#xff0c;也可以自行测试下CS1.5的FPS值稳定否哈哈。 打cs1.5 600元装机方案A&#xff1a; 点击查看详细内…

人大金仓下载安装教程总结

文章目录前言背景&#xff1a; 工作中进行信创改造&#xff0c;需要把mysql&#xff0c;postgresql数据迁移到人大金仓一、人大金仓是什么&#xff1f;二、使用场景三、下载安装教程四、优势五、环境及要求六、工具以及词汇介绍总结前言 背景&#xff1a; 工作中进行信创改造&…