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

flutter开发多端平台应用的探索 下 (跨模块、跨语言通信之平台通道)

前文

Flutter 是一个跨平台的开发框架,它允许开发者使用相同的代码库来构建 iOS、Android、Web 和桌面应用程序。

上文flutter开发多端平台应用的探索 上(基本操作)-CSDN博客列举了一些特定平台的case(桌面端菜单,鼠标快捷键)的使用方法,有些是flutter提供了对应能力,只需要学习如何调API,有些事三方库支持,本文要探讨的平台通道是更为强大的工具,很多三方插件底层也是使用了平台通道的能力,我们也可以用平台通道来完成各种各样需要做的操作。

平台通道

介绍以及使用

Flutter官方框架目前对一些特定的功能(比如桌面端的菜单、多窗口管理等)支持有限,很多功能是通过第三方库来实现的。这些第三方库大多使用了Flutter的平台通道(Platform Channels)机制,与原生平台代码交互来提供相应的功能。

在开发中,很多flutter开发受限的操作我们也可以使用平台通道机制,类似Android开发的JNI,JSI。


编写平台通道的基本步骤:

1. 在Flutter中创建一个平台通道

        使用MethodChannel类创建一个通道,并指定一个唯一的通道名称。

2. 在Dart中定义需要调用的原生方法

        使用invokeMethod函数调用通道上的方法。

3. 在原生代码中接收来自Flutter的消息

        在相应的原生平台代码中实现相应的通道和方法处理逻辑。

如下是一个获取运行平台的系统版本的例子

flutter侧

import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; // 导入平台通道的包void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});@overrideWidget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: const Text('Platform Channel Demo')),body: const Center(child: PlatformVersionWidget()),),);}
}class PlatformVersionWidget extends StatefulWidget {const PlatformVersionWidget({super.key});@overrideState<PlatformVersionWidget> createState() => _PlatformVersionWidgetState();
}class _PlatformVersionWidgetState extends State<PlatformVersionWidget> {static const platform = MethodChannel('com.example.platform/version'); // 创建平台通道String _platformVersion = 'Unknown';Future<void> _getPlatformVersion() async {String version;try {version = await platform.invokeMethod('getPlatformVersion'); // 调用原生方法} on PlatformException catch (e) {version = "Failed to get platform version: '${e.message}'.";}setState(() {_platformVersion = version;});}@overrideWidget build(BuildContext context) {return Column(mainAxisAlignment: MainAxisAlignment.center,children: [Text('Platform Version: $_platformVersion'),ElevatedButton(onPressed: _getPlatformVersion,child: const Text('Get Platform Version'),),],);}
}

原生平台侧

android/app/src/main/kotlin/example/MainActivity.kt添加以下代码:

package com.example.platformchannelimport io.flutter.embedding.android.FlutterActivity
import io.flutter.plugin.common.MethodChannelclass MainActivity: FlutterActivity() {private val CHANNEL = "com.example.platform/version"override fun configureFlutterEngine(flutterEngine: io.flutter.embedding.engine.FlutterEngine) {super.configureFlutterEngine(flutterEngine)MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {call, result ->if (call.method == "getPlatformVersion") {val version = "Android ${android.os.Build.VERSION.RELEASE}"result.success(version)} else {result.notImplemented()}}}
}

ios/Runner/AppDelegate.swift添加以下代码:

import UIKit
import Flutter@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {override func application(_ application: UIApplication,didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {let controller = window?.rootViewController as! FlutterViewControllerlet channel = FlutterMethodChannel(name: "com.example.platform/version", binaryMessenger: controller.binaryMessenger)channel.setMethodCallHandler { (call, result) inif call.method == "getPlatformVersion" {result("iOS " + UIDevice.current.systemVersion)} else {result(FlutterMethodNotImplemented)}}return super.application(application, didFinishLaunchingWithOptions: launchOptions)}
}

原理探究

lutter平台通道的底层原理是基于消息传递机制实现的,它允许Flutter代码与各个原生平台代码之间进行双向通信。这个机制的核心在于Flutter引擎提供的二进制消息传递和解码协议

平台通道的基础架构由以下几个部分组成:

Flutter Engine:Flutter引擎负责运行Dart代码,并提供渲染、事件处理和平台通道等功能。Flutter引擎使用二进制消息在Flutter应用和平台端之间传递数据。

Dart 端的 MethodChannel:在Dart中,通过MethodChannel类创建一个通道。MethodChannel 允许Flutter应用向原生平台发送方法调用并接收响应。

原生平台端的 MethodChannel 实现:在原生平台代码中,开发者需要实现一个与Dart端相同通道名称的处理器,来接收来自Flutter的消息,并将结果返回给Flutter。

平台通道的消息传递基于异步二进制消息流,整个过程大致可以分为以下几步:

1. 在Dart代码中,开发者创建一个MethodChannel对象,指定一个唯一的通道名称(如com.example.platform/version)。

2. Dart代码使用invokeMethod方法通过通道发送一个方法调用请求,这个请求包括:

• 通道名称。

• 方法名称。

• 可选参数。

3. Flutter引擎将Dart端的方法调用和参数序列化为二进制消息格式,并将其发送到原生平台。

4. 原生平台代码中的相应通道接收到消息后,将其反序列化为平台特定的数据结构。然后,调用相应的方法并传入参数。

5. 原生平台执行对应的方法,并将结果或错误返回给Flutter引擎。

6. Flutter引擎接收到原生平台的响应后,将其反序列化为Dart对象,并将其传递给Dart代码中的invokeMethod调用者。

平台通道中的消息传递是基于二进制数据的,所有的数据在传输之前都需要序列化为二进制格式。Flutter引擎使用以下格式进行序列化:

• 标准消息编解码器:支持传输各种常见的Dart对象类型,如int、double、bool、String、List、Map等。

• JSON消息编解码器:将Dart对象序列化为JSON字符串,但不支持某些复杂类型。

• 二进制消息编解码器:直接传输二进制数据。

开发者可以自定义自己的编解码器,以支持自定义的数据结构和序列化格式。

Flutter平台通道支持两种异步模式:

1. 单一消息响应模式:即一个方法调用对应一个响应(通常通过invokeMethod发起)。

2. 数据流模式:使用EventChannel来处理持续的数据流,这种模式适合用于监听事件(如传感器数据、位置更新等)。

补充说明:消息通信机制

当invokeMethod在Dart中被调用时,Flutter引擎将方法名和参数使用编码器序列化为二进制格式,然后,这个二进制消息通过Flutter引擎的C++代码传递给Java层,使用BinaryMessenger来发送和接收信息,使用JNI调用相应的Java方法。在Java端,Flutter的Java层实现了一个MethodChannel来接收和处理这些消息。它使用MethodChannel.setMethodCallHandler来设置一个消息处理器,处理传入的消息,并调用对应的Java方法。处理完消息后,Java代码会将结果编码回一个二进制格式,通过JNI回传给Flutter引擎。Flutter引擎将接收到的结果解码为Dart对象,并通过Future对象的回调机制将结果返回给调用者。

谨上

相关文章:

flutter开发多端平台应用的探索 下 (跨模块、跨语言通信之平台通道)

前文 Flutter 是一个跨平台的开发框架&#xff0c;它允许开发者使用相同的代码库来构建 iOS、Android、Web 和桌面应用程序。 上文flutter开发多端平台应用的探索 上&#xff08;基本操作&#xff09;-CSDN博客列举了一些特定平台的case&#xff08;桌面端菜单&#xff0c;鼠…...

第15-02章:理解Class类并获取Class实例

我的后端学习大纲 我的Java学习大纲 1、Java反射机制原理图&#xff1a; 源代码通过Javac编译得到字节码文件&#xff0c;当我执行到new一个对象的时候&#xff0c;字节码文件会通过ClassLoader被加载&#xff0c;然后得到一个Class类对象&#xff0c;存放在堆中&#xff0c;加…...

【Authing身份云-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…...

idea插件推荐之Cool Request

Cool Request是一款基于IDEA的HTTP调试工具&#xff0c;可以看成是轻量版的postman&#xff0c;它会自动扫描项目代码中所有API路径&#xff0c;按项目分组管理。一个类被定义为Controller且其中的方法被RequestMapping或者XXXMapping注解标注以后就会被扫描到。 对应方法左侧会…...

从卫星和飞机等不同传感器方面由QGIS 遥感分析

在地理信息科学 (GIS) 中,遥感是指从远处获取有关地球表面特征信息的行为。遥感数据是从许多不同的平台获取而来,包括卫星、飞机和具有许多不同传感器的固定仪器,包括光谱图像(相机)和激光雷达。最常见的遥感数据形式是卫星和航空图像。 为了充分实现这些照片的价值,需要…...

什么是AIGC?有哪些免费工具?

AIGC&#xff08;AI Generated Content&#xff09;&#xff0c;即“人工智能生成内容”&#xff0c;是指通过人工智能技术自动生成各种类型的数字内容。AIGC 让机器能够根据输入的信息或数据生成符合人类需求的文本、图像、音频、视频等内容&#xff0c;极大提高了内容创作的效…...

腾讯云升级多个云存储解决方案 以智能化存储助力企业增长

9月6日&#xff0c;在腾讯数字生态大会腾讯云储存专场上&#xff0c;腾讯云升级多个存储解决方案&#xff1a;Data Platform 数据平台解决方案重磅发布&#xff0c;数据加速器 GooseFS、数据处理平台数据万象、日志服务 CLS、高性能并行文件存储 CFS Turbo 等多产品全新升级&am…...

Kubernetes 集群初步部署

Kubernetes 集群初步部署 目标 本手册旨在指导您在多台虚拟机上部署一个基础的Kubernetes集群&#xff0c;并安装必要的工具和组件。 准备工作 确保所有虚拟机已经准备好&#xff0c;并且具有足够的资源来运行Kubernetes集群。虚拟机操作系统版本一致&#xff0c;推荐使用R…...

从源码到成品:直播美颜SDK与主播美颜工具的开发全流程

本篇文章&#xff0c;小编将带你深入了解从源码到成品的开发全流程&#xff0c;探讨如何构建一个功能完善的直播美颜SDK与主播美颜工具。 一、需求分析与技术规划 在开发任何工具之前&#xff0c;需求分析是第一步。在美颜工具的开发过程中&#xff0c;需要明确以下几点&…...

AMD EPYC 9004服务器内存配置深度分析:为何全通道填充是关键?

在一次技术沟通中&#xff0c;客户询问在部署AMD EPYC 9004服务器时&#xff0c;是否应该完全填充内存通道&#xff1f; 考虑到AMD正在用5年的更新周期替换其AMD EPYC 7002 “Rome”和Cascade Lake一代的服务器&#xff0c;他们认为通过减少内存插槽的填充&#xff0c;可以节省…...

redis的事务与管道有什么不同?

Redis 的事务&#xff08;MULTI/EXEC&#xff09;和管道&#xff08;PIPELINE&#xff09;都是为了执行多条命令&#xff0c;但它们的工作原理和目标不同。以下是两者的详细对比。 1. Redis 事务 (MULTI/EXEC) 特点&#xff1a; 事务的本质&#xff1a;Redis 事务是一组命令的…...

Redis 配置

一、关系型数据库与非关系型数据库 1. 关系型数据库 关系型数据库是一种结构化数据库&#xff0c;基于关系模型&#xff08;二维表格模型&#xff09;&#xff0c;适合记录数据。通过 SQL&#xff08;结构化查询语言&#xff09;进行数据的检索和操作。主流的关系型数据库包括…...

【Qt笔记】QTableWidget控件详解

目录 引言 一、QTableWidget的特点 二、QTableWidget基础 2.1 引入QTableWidget 2.2 基本属性 三、代码示例&#xff1a;初始化QTableWidget 四、编辑功能 4.1 设置单元格为只读 4.2 响应内容更改 五、选择模式 六、样式定制 七、与其他控件的交互 7.1 在单元格…...

高低压配电系统中电弧光的危害有多大?

摘要 故障电弧是一种常见的电气故障现象&#xff0c;尤其在配电系统中&#xff0c;可能对设备安全和电力供应造成严重影响。本文旨在探讨故障电弧对配电系统的危害&#xff0c;并提出相应的预防措施&#xff0c;以增强系统的可靠性和安全性。通过对故障电弧的形成机制、危害分…...

安宝特案例 | AR如何大幅提升IC封装厂检测效率?

前言&#xff1a;如何提升IC封装厂检测效率&#xff1f; 在现代电子产品的制造过程中&#xff0c;IC封装作为核心环节&#xff0c;涉及到复杂处理流程和严格质量检测。这是一家专注于IC封装的厂商&#xff0c;负责将来自IC制造商的晶圆进行保护、散热和导通处理。整个制程繁琐…...

QGIS 如何连接空间库,并实时编辑空间表?编辑后库表如何刷新,保证是最新数据?

文章目录 一、什么是 qgis&#xff1f;二、qgis 如何连接数据库三、实时编辑空间表四、编辑后库表如何刷新&#xff0c;保证是最新数据&#xff1f;五、总结 一、什么是 qgis&#xff1f; QGIS&#xff08;原称Quantum GIS&#xff09;是一个用户界面友好的开源桌面端软件&…...

CleanClip for mac(苹果电脑剪切板管理器)

CleanClip 是一款为 Mac 设计的强大剪贴板管理工具&#xff0c;它能够显著提升你的工作效率和生产力。无论是在日常办公中还是进行创意设计&#xff0c;CleanClip 都能帮助你更轻松地管理和使用剪贴板内容。让我们一起来探索一下这个功能丰富的软件吧&#xff01; 下载地址&am…...

嵌入式栈溢出怎么办?

在写文件的时候,因为把FATFS这些数据结构定义在了函数里,所以栈溢出了,我把比较大的数据结构放在全局变量上,就没事了.目前仅测试阶段,也可以放在堆里.不用的时候释放掉,减少耦合度.或者加static....

工厂安灯系统在优化生产流程上的优势

工厂安灯系统通过可视化的方式&#xff0c;帮助工厂管理者和操作工人及时了解生产状态&#xff0c;快速响应问题&#xff0c;从而优化生产流程。 一、安灯系统实时监控与反馈 安灯系统的核心功能是实时监控生产线的状态。通过在生产现场设置灯光、显示屏等设备&#xff0c;工人…...

【Kubernetes】(K8S)彻底卸载详细教程

以下全部操作都是使用root用户进行&#xff08;非root用户可以使用sudo&#xff09;&#xff0c;并且全部命令都需要在Kubernetes集群的所有节点分别执行&#xff1a; 第一步、停止K8S 所有节点执行&#xff1a; 1 2 3 systemctl stop kubelet systemctl stop etcd systemct…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...

OCR MLLM Evaluation

为什么需要评测体系&#xff1f;——背景与矛盾 ​​ 能干的事&#xff1a;​​ 看清楚发票、身份证上的字&#xff08;准确率>90%&#xff09;&#xff0c;速度飞快&#xff08;眨眼间完成&#xff09;。​​干不了的事&#xff1a;​​ 碰到复杂表格&#xff08;合并单元…...

STM32标准库-ADC数模转换器

文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”&#xff1a;输入模块&#xff08;GPIO、温度、V_REFINT&#xff09;1.4.2 信号 “调度站”&#xff1a;多路开关1.4.3 信号 “加工厂”&#xff1a;ADC 转换器&#xff08;规则组 注入…...

轻量级Docker管理工具Docker Switchboard

简介 什么是 Docker Switchboard &#xff1f; Docker Switchboard 是一个轻量级的 Web 应用程序&#xff0c;用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器&#xff0c;使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...

【java面试】微服务篇

【java面试】微服务篇 一、总体框架二、Springcloud&#xff08;一&#xff09;Springcloud五大组件&#xff08;二&#xff09;服务注册和发现1、Eureka2、Nacos &#xff08;三&#xff09;负载均衡1、Ribbon负载均衡流程2、Ribbon负载均衡策略3、自定义负载均衡策略4、总结 …...

Copilot for Xcode (iOS的 AI辅助编程)

Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot&#xff0c;它能根据上下文补全代码&#xff0c;快速生成常用…...