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双向简单消息传递(字符串、二进制数据)

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

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

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

相关文章

Python控制语句-循环语句-while

1.若k为整形,下述while循环执行的次数为()。 k=1000 while k>1: print(k) k=k/2 A、9 B、10 C、11 D、100 答案:A。k=k/2意味着每循环一次,k的值就会变为原来的一半,直到k的值不大于1。 2.下面的代码,哪些会输出1,2,3三个数字( )。 A、 for i in range(3): print(i) …

十二天-双指针技术:链表问题的高效解法

一、双指针技术分类 1. 同速双指针&#xff08;同向移动&#xff09; 特点&#xff1a;两个指针以相同速度移动适用场景&#xff1a; 链表逆序查找倒数第 k 个元素删除倒数第 n 个节点 2. 快慢双指针&#xff08;异速移动&#xff09; 特点&#xff1a;一个指针每次移动 1 步…

【vllm】Qwen2.5-VL-72B-AWQ 部署记录

版本&#xff1a;0.7.2 注意事项&#xff1a; export LD_LIBRARY_PATH/home/xxxxx/anaconda3/envs/xxxxx/lib/python3.10/site-packages/nvidia/nvjitlink/lib:$LD_LIBRARY_PATH # 如果报错可能需要Also pip install --force-reinstall githttps://github.com/huggingface/tra…

深度学习与大模型-张量

大家好&#xff01;今天我们来聊聊张量&#xff08;Tensor&#xff09;。别被这个词吓到&#xff0c;其实它没那么复杂。 什么是张量&#xff1f; 简单来说&#xff0c;张量就是一个多维数组。你可以把它看作是一个装数据的容器&#xff0c;数据的维度可以是一维、二维&#…

【前端面试题】Vu3常见的面试题

1.Vue3与 Vue2的核心区别有哪些&#xff1f; ‌ 响应式系统 ‌&#xff1a; ‌ Vue2&#xff1a;通过Object.defineProperty 实现响应式。这种方式在处理对象属性的添加和删除时存在局限性&#xff0c;且无法直接监控数组的变化 ‌;‌Vue3&#xff1a;采用Proxy 实现响应式&…

Android 粘包与丢包处理工具类:支持多种粘包策略的 Helper 实现

在Android开发中&#xff0c;处理TCP/UDP通信时&#xff0c;粘包和丢包是常见的问题。粘包是指多个数据包被接收方一次性接收&#xff0c;导致数据包之间的界限不清晰&#xff1b;丢包则是指数据包在传输过程中丢失。为了处理这些问题&#xff0c;我们可以编写一个帮助类 Packe…

【C++11】移动语义

回顾 const int c的c是可以被取地址的&#xff0c;尽管是常量。所以以是否为常量来判断是否为右值是错误的。 左值与右值正确的区分方法是是否能够被取地址。&#xff08;能被取地址也就代表着是一个持久状态&#xff0c;即有持久的存储空间的值&#xff09; 常见的左值有我们…

LangChain教程 - Agent -之 ZERO_SHOT_REACT_DESCRIPTION

在构建智能 AI 助手时&#xff0c;我们希望模型能够智能地调用工具&#xff0c;以便提供准确的信息。LangChain 提供了 AgentType.ZERO_SHOT_REACT_DESCRIPTION&#xff0c;它结合了 ReAct&#xff08;Reasoning Acting&#xff09;策略&#xff0c;使得 LLM 可以基于工具的描…

移动Android和IOS自动化中常见问题

APP测试逻辑 在app编写自动化测试用例时&#xff0c;通常会出现只是简单的点点点过程&#xff0c;然而却忽略了在实际的自动化实现过程中&#xff0c;软件是对app元素的判断来执行测试脚本。所以会出现在后期已经写好自动化脚本之后还会对测试用例的更新。 App在测试时&#…

python高效试用17---两个字符串组成一个新的字符串和两个字符串组成元组作为key哪个更高效

在 Python 中&#xff0c;使用字符串连接 (str1 str2) 作为 key 和使用元组 ((str1, str2)) 作为 key 的效率差异&#xff0c;主要受以下因素影响&#xff1a; 哈希计算速度&#xff1a; 字符串连接 (str1 str2)&#xff1a;会创建一个新的字符串对象&#xff0c;并计算哈希…

深入浅出Java try-with-resources:告别资源泄漏的烦恼

一、为什么需要try-with-resources&#xff1f; 在Java开发中&#xff0c;我们经常需要处理各种资源&#xff1a;文件流、数据库连接、网络套接字等。这些资源都有一个共同特点——必须在使用后正确关闭。传统的资源管理方式存在三大痛点&#xff1a; 代码臃肿&#xff1a;每…

Python+DeepSeek:开启AI编程新次元——从自动化到智能创造的实战指南

文章核心价值 技术热点:结合全球最流行的编程语言与国产顶尖AI模型实用场景:覆盖代码开发/数据分析/办公自动化等高频需求流量密码:揭秘大模型在编程中的创造性应用目录结构 环境搭建:5分钟快速接入DeepSeek场景一:AI辅助代码开发(智能补全+调试)场景二:数据分析超级助…

Linux tcpdump -any抓的包转换成标准的pcap

在 Linux 中使用 tcpdump -any 抓包并转换为标准 pcap 文件时出现额外字段,通常与 链路层协议头部的差异 以及 pcap 文件格式的兼容性 有关。以下是详细原因和解决方案: 一、问题原因分析 -any 选项的局限性 tcpdump -any 会自动猜测链路层协议类型(如 Ethernet、IEEE 802…

【SpringMVC】深入解析使用 Postman 在请求中传递对象类型、数组类型、参数类型的参数方法和后端参数重命名、及非必传参数设置的方法

SpringMVC—请求传参 1. 传递对象 如果参数比较多时&#xff0c;方法声明就需要有很多形参&#xff1b;并且后续每次新增一个参数&#xff0c;也需要修改方法声明. 我们不妨把这些参数封装为一个对象&#xff1b; Spring MVC 也可以自动实现对象参数的赋值&#xff0c;比如 Us…

一个差劲的软件设计

项目概况&#xff1a; 之前自己设计并开发了一个用C#开发的上位机软件&#xff0c;整个软件只有一个Form&#xff0c;一个TabControl&#xff0c;3个TabControlPanel&#xff0c;总共100多个lable、textbox、ListBox等控件都放在这3个TabControlPanel里。 问题&#xff1a; 1.…

Linux练级宝典->进程控制详解(进程替换,fork函数)

目录 进程创建 fork函数 写时拷贝 进程终止 进程退出码 exit函数 _exit函数 return&#xff0c;exit _exit之间的区别和联系 进程等待 进程等待的必要性 获取子进程status 进程等待的方法 wait waipid 多子进程创建理解 非阻塞轮询检测子进程 进程程序替换 替…

RabbitMq--消息可靠性

12.消息可靠性 1.消息丢失的情况 生产者向消息代理传递消息的过程中&#xff0c;消息丢失了消息代理&#xff08; RabbitMQ &#xff09;把消息弄丢了消费者把消息弄丢了 那怎么保证消息的可靠性呢&#xff0c;我们可以从消息丢失的情况入手——从生产者、消息代理&#xff0…

Windows中在VSCode/Cursor上通过CMake或launch文件配置CUDA编程环境

前置步骤 安装符合GPU型号的CUDA Toolkit 配置好 nvcc 环境变量 安装 Visual Studio 参考https://blog.csdn.net/Cony_14/article/details/137510909 VSCode 安装插件 Nsight Visual Studio Code Edition 注意&#xff1a;不是vscode-cudacpp。若两个插件同时安装&#xff0c;…

Spark(8)配置Hadoop集群环境-使用脚本命令实现集群文件同步

一.hadoop的运行模式 二.scp命令————基本使用 三.scp命令———拓展使用 四.rsync远程同步 五.xsync脚本集群之间的同步 一.hadoop的运行模式 hadoop一共有如下三种运行方式&#xff1a; 1. 本地运行。数据存储在linux本地&#xff0c;测试偶尔用一下。我们上一节课使用…

聚焦两会:科技与发展并进,赛逸展2025成创新新舞台

在十四届全国人大三次会议和全国政协十四届三次会议期间&#xff0c;代表委员们围绕多个关键议题展开深入讨论&#xff0c;为国家未来发展谋篇布局。其中&#xff0c;技术竞争加剧与经济转型需求成为两会焦点&#xff0c;将在首都北京举办的2025第七届亚洲消费电子技术贸易展&a…