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

Flutter——最详细原生交互(MethodChannel、EventChannel、BasicMessageChannel)使用教程

  1. MethodChannel(方法通道)
    用途:实现 双向通信,用于调用原生平台提供的 API 并获取返回结果。
    场景:适合一次性操作,如调用相机、获取设备信息等。

使用步骤:

  • Flutter 端:通过 MethodChannel监听事件流。
  static const platform =MethodChannel('com.example.fltest.plugin.DeviceInfoPlugin');
  • Android 端(Kotlin)
    private var methodChannel: MethodChannel? = nullval CHANNEL: String = "com.example.fltest.plugin.DeviceInfoPlugin"private fun getPhoneNumber(): Any? {val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager?
//        val phoneNumber = telephonyManager!!.line1Numberval phoneNumber = "18627000332"return phoneNumber}
  1. EventChannel(事件通道)
    用途:实现 单向数据流,用于原生平台向 Flutter 持续发送事件(如传感器数据)。
    场景:适合实时数据流,如监听陀螺仪、GPS 位置更新等。
    使用步骤:
  • Flutter 端:通过 EventChannel 监听事件流。
static const eventChannel =EventChannel('com.example.fltest.plugin.DeviceInfoPlugin/event');Stream<int> get _batteryLevelStream {return eventChannel.receiveBroadcastStream("111").cast<int>();}
  • Android 端(Kotlin)
 
class DeviceInfoPlugin(var context: Context) : EventChannel.StreamHandler, FlutterPlugin {private var eventChannel: EventChannel? = nullval EVENT_CHANNEL: String = "com.example.fltest.plugin.DeviceInfoPlugin/event"override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {result.notImplemented()}override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {setupChannels(binding.binaryMessenger, binding.applicationContext)}override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {teardownChannels()}private fun setupChannels(messenger: BinaryMessenger, context: Context) {this.context = contexteventChannel = EventChannel(messenger, EVENT_CHANNEL)eventChannel?.setStreamHandler(this)}private fun teardownChannels() {eventChannel?.setStreamHandler(null)eventChannel = null}private val mainHandler = Handler(Looper.getMainLooper())override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {Toast.makeText(context, arguments.toString(), Toast.LENGTH_SHORT).show()events?.let {sendBatteryLevel(it)events.success(1)mainHandler.postDelayed({events.success(2)}, 2000)mainHandler.postDelayed({ events.success(3) }, 4000)}}override fun onCancel(arguments: Any?) {}private fun sendBatteryLevel(events: EventChannel.EventSink) {val batteryLevel = -1if (batteryLevel != -1) {events.success(batteryLevel)} else {events.error("UNAVAILABLE", "Battery level not available.", null);}}
}
  1. BasicMessageChannel(基础消息通道)
    用途:支持 异步消息传递,使用自定义编解码器传递数据。
    场景:适合简单的数据交换(如 JSON、二进制数据)。

使用步骤:

  • Flutter 端:通过 BasicMessageChannel监听事件流。
  final BasicMessageChannel<String> messageChannel =BasicMessageChannel<String>('com.example.fltest.plugin.DeviceInfoPlugin/basicMessage',StringCodec(),);// 发送消息
Future<String> sendMessage(String message) async {return await messageChannel.send(message);
}void initState() {super.initState();// 设置消息处理器messageChannel.setMessageHandler((String? message) async {print('Received message from native: $message');return '$message';});}
  • Android 端(Kotlin)
package com.example.fltest.pluginimport android.content.Context
import android.os.Handler
import android.os.Looper
import android.telephony.TelephonyManager
import android.widget.Toast
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.plugin.common.BasicMessageChannel
import io.flutter.plugin.common.BasicMessageChannel.Reply
import io.flutter.plugin.common.BinaryMessenger
import io.flutter.plugin.common.EventChannel
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.StandardMessageCodec
import io.flutter.plugin.common.StringCodecclass DeviceInfoPlugin(var context: Context) :  FlutterPlugin {private var basicMessageChannel: BasicMessageChannel<String>? = nullval BASIC_MESSAGE_CHANNEL: String = "com.example.fltest.plugin.DeviceInfoPlugin/basicMessage"override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {result.notImplemented()}override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {setupChannels(binding.binaryMessenger, binding.applicationContext)}override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {teardownChannels()}private fun setupChannels(messenger: BinaryMessenger, context: Context) {this.context = contextbasicMessageChannel = BasicMessageChannel(messenger, BASIC_MESSAGE_CHANNEL, StringCodec.INSTANCE)basicMessageChannel?.setMessageHandler { message, reply ->println("Received message from Flutter: $message")reply.reply("Message received")basicMessageChannel?.send(message) { reply -> Toast.makeText(context, reply.toString(), Toast.LENGTH_SHORT).show() }}// 发送消息
basicMessageChannel.send("Hello from Android") { reply ->Log.d("TAG", "Reply: $reply")
}}private fun teardownChannels() {}override fun onCancel(arguments: Any?) {}}

在MainActivity初始化添加插件类

package com.example.fltestimport com.example.fltest.plugin.DeviceInfoPlugin
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngineclass MainActivity: FlutterActivity(){override fun configureFlutterEngine(flutterEngine: FlutterEngine) {super.configureFlutterEngine(flutterEngine)flutterEngine.plugins.add(DeviceInfoPlugin(this))}
}

总结:

方法方向使用场景
MethodChannel双向调用原生 API 并获取结果
EventChannel单向(原生→Flutter)监听持续事件(如传感器)
BasicMessageChannel双向简单消息传递(字符串、二进制数据)

根据具体需求选择合适的方式,可覆盖绝大多数跨平台交互场景。

相关文章:

Flutter——最详细原生交互(MethodChannel、EventChannel、BasicMessageChannel)使用教程

MethodChannel&#xff08;方法通道&#xff09; 用途&#xff1a;实现 双向通信&#xff0c;用于调用原生平台提供的 API 并获取返回结果。 场景&#xff1a;适合一次性操作&#xff0c;如调用相机、获取设备信息等。 使用步骤&#xff1a; Flutter 端&#xff1a;通过 Meth…...

Kafka常用指令(详细)

Kafka常用指令&#xff08;详细&#xff09; 启停命令 前台启动 前台启动命令 ./bin/kafka-server-start.sh config/server.properties 后台启动方式1 后台启动命令加上参数-daemon&#xff0c;窗口关闭之后kafka后台程序继续运行 ./bin/kafka-server-start.sh -daemon co…...

供应链工作效率如何提升

提升供应链工作效率可以从以下几个关键方面入手&#xff1a; 1. 优化供应链管理 数据驱动决策&#xff1a;利用AI和大数据分析&#xff0c;提高预测准确性&#xff0c;优化库存管理。供应链可视化&#xff1a;采用ERP&#xff08;企业资源计划&#xff09;和SCM&#xff08;供…...

1-001:MySQL的存储引擎有哪些?它们之间有什么区别?

MySQL 存储引擎 ├── InnoDB&#xff08;默认引擎&#xff09; │ ├── 事务支持&#xff1a;支持 ACID 和事务&#xff08;事务日志、回滚、崩溃恢复&#xff09; │ ├── 锁机制&#xff1a;支持行级锁&#xff0c;提高并发性能 │ ├── 外键支持&#xff1a;支持外键…...

Java/Kotlin逆向基础与Smali语法精解

1. 法律警示与道德边界 1.1 司法判例深度剖析 案例一&#xff1a;2021年某游戏外挂团伙刑事案 犯罪手法&#xff1a;逆向《王者荣耀》通信协议&#xff0c;修改战斗数据包 技术细节&#xff1a;Hook libil2cpp.so的SendPacket函数 量刑依据&#xff1a;非法经营罪&#xff…...

用AI学编程4——swift学习1

一个swift文件&#xff0c; 整理出swift从入门到精通的所有知识点&#xff0c; 给出注释&#xff0c; 给出这样的swift文件 以下是一个整合了 Swift 从入门到精通的主要知识点的 Swift 文件&#xff0c;包含了基础语法、面向对象编程、异常处理、集合框架、多线程、Lambda 表达…...

数据集构建与训练前准备

训练数据集目录结构与格式 作者笨蛋学法&#xff0c;先将其公式化&#xff0c;后面逐步自己进行修改&#xff0c;读者觉得看不懂可以理解成&#xff0c;由结果去推过程&#xff0c;下面的这个yaml文件就是结果&#xff0c;我们去推需要的文件夹(名字可以不固定&#xff0c;但是…...

在大型语言模型的提示词设计中,system、user和assistant三个角色的区别与联系

在大型语言模型的提示词设计中,system、user和assistant三个角色承担不同的功能,其区别与联系如下: 1. 角色定义与功能 system(系统指令) 作用:设定模型的整体行为、角色定位和任务框架。例如,“你是一位专业的科技作家”或“仅回答与医疗相关的问题”。特点:在多轮对话…...

Zabbix监控进程报警(Zabbix Monitoring Process Alarm)

zabbix监控进程占cpu、内存、磁盘RAID情况 1、cpu达到90%时报警 名称: cpu user percent gt 90% 表达式&#xff1a;{Template OS Linux:system.cpu.util[,idle].avg(1m)}<10 2、内存达到80%时报警 配置—主机(选择监控主机)—监控项—创建监控项 1、创建监控项 名称&…...

p5.js:sound(音乐)可视化,动画显示音频高低变化

本文通过4个案例介绍了使用 p5.js 进行音乐可视化的实践&#xff0c;包括将音频振幅转化为图形、生成波形图。 承上一篇&#xff1a;vite&#xff1a;初学 p5.js demo 画圆圈 cd p5-demo copy .\node_modules\p5\lib\p5.min.js . copy .\node_modules\p5\lib\addons\p5.soun…...

HAL库常用函数

一、通用函数 系统初始化&#xff1a; HAL_Init(): 初始化HAL库和系统时钟&#xff08;调用前需配置系统时钟源&#xff09;。 HAL_Delay(uint32_t Delay): 毫秒级阻塞延时&#xff08;基于SysTick定时器&#xff09;。 HAL_GetTick(): 获取系统运行时间&#xff08;毫秒计数…...

【Zinx】Day5-Part3:Zinx 的连接管理

目录 Day5-Part3&#xff1a;Zinx 的连接管理创建连接管理模块将连接管理模块集成到 Zinx 当中将 ConnManager 集成到 Server 当中在 Connection 的工厂函数中将连接添加到 ConnManagerServer 中连接数量的判断连接的删除 补充&#xff1a;连接的带缓冲发包方式补充&#xff1a…...

C语言:6.20字符型数据练习题

编写程序,输人一行数字字符(用回车结束),每个数字字符 的前后都有空格。 把这一行中的数字转换成一个整数。 例如,若输入(<CR>代表 Enter键):2 4 8 3<CR>则输出 整数:2483。 #include <stdio.h>int main() {char ch;int number 0;printf("请输入一行…...

SpringBoot Test详解

目录 spring-boot-starter-test 1、概述2、常用注解 2.1、配置类型的注解2.2、Mock类型的注解2.3、自动配置类型的注解2.4、启动测试类型的注解2.5、相似注解的区别和联系 3、SpringBootTest和Junit的使用 3.1、单元测试3.2、集成测试 4、MockMvc 4.1、简单示例4.2、自动配置4…...

CDefView::_GetPIDL函数分析之ListView_GetItem函数的参数item的item.mask 为LVIF_PARAM

CDefView::_GetPIDL函数分析之ListView_GetItem函数的参数item的item.mask 为LVIF_PARAM 第一部分&#xff1a; 1: kd> t SHELL32!CDefView::_GetPIDL: 001b:77308013 55 push ebp 1: kd> dv this 0x00000015 i 0n21 …...

Android Retrofit 框架注解定义与解析模块深度剖析(一)

一、引言 在现代 Android 和 Java 开发中&#xff0c;网络请求是不可或缺的一部分。Retrofit 作为 Square 公司开源的一款强大的类型安全的 HTTP 客户端&#xff0c;凭借其简洁易用的 API 和高效的性能&#xff0c;在开发者社区中广受欢迎。Retrofit 的核心特性之一便是通过注…...

项目上传到Gitee过程

在gitee上新建一个仓库 点击“克隆/下载”获取仓库地址 电脑上要装好git 在电脑本地文件夹右键“Git Bash Here” 依次执行如下命令 git init git remote add origin https://gitee.com/qlexcel/stm32-simple.git git pull origin master git add . git commit -m ‘init’…...

DeepSeek R1在医学领域的应用与技术分析(Discuss V1版)

DeepSeek R1作为一款高性能、低成本的国产开源大模型,正在深刻重塑医学软件工程的开发逻辑与应用场景。其技术特性,如混合专家架构(MoE)和参数高效微调(PEFT),与医疗行业的实际需求紧密结合,推动医疗AI从“技术驱动”向“场景驱动”转型。以下从具体业务领域需求出发,…...

数学之快速幂-数的幂次

题目描述 给定三个正整数 N,M,P&#xff0c;求 输入描述 第 1 行为一个整数 T&#xff0c;表示测试数据数量。 接下来的 T 行每行包含三个正整数 N,M,P。 输出描述 输出共 T 行&#xff0c;每行包含一个整数&#xff0c;表示答案。 输入输出样例 示例 1 输入 3 2 3 7 4…...

git subtree管理的仓库怎么删除子仓库

要删除通过 git subtree 管理的子仓库&#xff0c;可以按照以下步骤操作&#xff1a; 1. 确认子仓库路径 首先确认要删除的子仓库的路径&#xff0c;假设子仓库路径为 <subtree-path>。 2. 从主仓库中移除子仓库目录 使用 git rm 命令删除子仓库的目录&#xff1a; …...

学习资料电子版 免费下载的网盘网站(非常全!)

我分享一个私人收藏的电子书免费下载的网盘网站&#xff08;学习资料为主&#xff09;&#xff1a; link3.cc/sbook123 所有资料都保存在网盘了&#xff0c;直接转存即可&#xff0c;非常的便利&#xff01; 包括了少儿&#xff0c;小学&#xff0c;初中&#xff0c;中职&am…...

SpringMVC-全局异常处理

文章目录 1. 全局异常处理2. 项目异常处理方案2.1 异常分类2.2 异常解决方案2.3 异常解决方案具体实现 1. 全局异常处理 问题&#xff1a;当我们在SpingMVC代码中没有对异常进行处理时&#xff0c;三层架构的默认处理异常方案是将异常抛给上级调用者。也就是说Mapper层报错会将…...

基于Spring Boot的宠物健康顾问系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

【Linux内核系列】:深入理解缓冲区

&#x1f525; 本文专栏&#xff1a;Linux &#x1f338;作者主页&#xff1a;努力努力再努力wz ★★★ 本文前置知识&#xff1a; 文件系统以及相关系统调用接口 输入以及输出重定向 那么在此前的学习中&#xff0c;我们了解了文件的概念以及相关的系统调用接口&#xff0c;并…...

Python开发Scikit-learn面试题及参考答案

目录 如何用 SimpleImputer 处理数据集中的缺失值? 使用 StandardScaler 对数据进行标准化的原理是什么?与 MinMaxScaler 有何区别? 如何用 OneHotEncoder 对类别型特征进行编码? 解释特征选择中 SelectKBest 与 VarianceThreshold 的应用场景。 如何通过 PolynomialFe…...

~(取反)在算法竞赛中的常见用法和注意事项

在算法竞赛中&#xff0c;取反符号 ~ 主要用于按位取反操作&#xff0c;其功能是对整数的二进制表示逐位取反&#xff08;0 变 1&#xff0c;1 变 0&#xff09;。以下是 ~ 在算法竞赛中的常见用法和注意事项&#xff1a; 1. 按位取反的基本用法 ~ 对整数的二进制表示进行取反…...

C++ MySQL 常用接口(基于 MySQL Connector/C++)

C MySQL 常用接口&#xff08;基于 MySQL Connector/C&#xff09; 1. 数据库连接 接口&#xff1a; sql::mysql::MySQL_Driver *driver; sql::Connection *con;作用&#xff1a; 用于创建 MySQL 连接对象。 示例&#xff1a; driver sql::mysql::get_mysql_driver_insta…...

本地部署 OpenManus 保姆级教程(Windows 版)

一、环境搭建 我的电脑是Windows 10版本&#xff0c;其他的没尝试&#xff0c;如果大家系统和我的不一致&#xff0c;请自行判断&#xff0c;基本上没什么大的出入啊。 openManus的Git地址&#xff1a;https://github.com/mannaandpoem/OpenManus 根据官网的两种安装推荐方式如…...

【Pandas】pandas Series compare

# Pandas2.2 Series ## Computations descriptive stats |方法|描述| |-|:-------| |Series.compare(other[, align_axis, ...])|用于比较两个 Series| ### pandas.Series.compare pandas.Series.compare 方法用于比较两个 Series&#xff0c;并返回一个包含差异的 DataFram…...

基于DeepSeek的智慧医药系统(源码+部署教程)

运行环境 智慧医药系统运行环境如下&#xff1a; 前端&#xff1a; HTMLCSS后端&#xff1a;Java AIGCDeepseekIDE工具&#xff1a;IDEA技术栈&#xff1a;Springboot HTMLCSS MySQL 主要角色 智慧医药系统主要分为两个角色。 游客 尚未进行注册和登录。具备登录注册、…...