Flutter 自定义插件基础

1、Flutter插件是什么?官方插件库

在开发Flutter应用过程中会涉及到平台相关接口调用,例如数据库操作、相机调用、外部浏览器跳转等业务场景。其实Flutter自身并不支持直接在平台上实现这些功能,而是通过插件包接口去调用指定平台API从而实现原生平台上特定功能。

2、Flutter插件的目录结构
  • lib 是对接dart端代码的入口,由此文件接收到参数后,通过channel将数据发送到原生端
  • android 安卓端代码实现目录
  • ios iOS原生端实现目录
  • example 一个依赖于该插件的Flutter应用程序,来说明如何使用它
  • README.md:介绍包的文件
  • CHANGELOG.md 记录每个版本中的更改
  • LICENSE 包含软件包许可条款的文件
3、Flutter插件包的创建方式

3.1 使用命令行创建

flutter create --template=package hello

可以通过–org指定包标识符

flutter create --template=package hello

通过参数指定iOS和Android代码使用的语言类型

flutter create --template=plugin -i swift -a kotlin hello

3.2 使用AS直接new工程

4、Flutter插件功能编写

Flutter插件模板生成后,在lib文件夹下会自动生成一个对外的入口dart类,该插件所包含的所有功能都以此类为入口,来提供外部进行调用。

platformVersion 是对外的方法调用,但是方法内部的实现逻辑,是通过原生端去获取的。对应Android原生端的入口文件如下:

监听来自dart端的请求,需要继承MethodChannel.MethodCallHandler接口,然后在onMethodCall方法回调中处理和返回给dart端数据逻辑。

result是给dart端回传最后结果的,如果dart不需要返回结果,也可以不调用

result.success(Object o)

如果一些简单的需求,可以直接在此处的plugin里实现,最后将结果直接返回。但是比如调起相机拍照,选取通讯录联系人,这些都要打开一个intent然后在OnActivityResult方法中去获取最终的结果,这种情况下如何处理呢?

继承 PluginRegistry.ActivityResultListener 接口

注意!!! >
直接将源码放在项目中的插件,在运行时候onActivityResult方法是不会被调用的,因为MainActivity中的onActivityResult将调用动作拦截了下来,所以必须将插件放在远端仓库中才可以正常接收

5、Flutter插件的两种注册方式
5.1 通过 registerWith 方式注册,早期非常老旧的方式

registerWith方式是通过反射进行加载

目前老版本项目里的插件都是使用这种方式注册,但是从flutter v1.12.x
开始往后官方推荐使用第二种方式注册,第一种方式会在以后的更新中废除,所以以后更新flutter大版本,可能要重新修改现有插件的注册方式

5.2 通过Flutter引擎注册

在Flutter1.12.X版本中正式将Embedding-V2API在Android平台默认开启,所有官方插件都迁移到了新的API。Embedding-V2APi的优势在于针对混合开发提供了更好的支持和内存上的优化

插件的注册方式定义在工程的android端的mainfest.xml文件中,如下所示:

<meta-dataandroid:name="flutterEmbedding"android:value="2" />

在插件的plugin文件中,继承FlutterPlugin接口,使用以下新的方式进行初始化

如需获取当前插件依附的activity,也就是mainActivity,则需要plugin集成ActivityAware接口,然后通过回调获取

6、Flutter 与原生之间如何交互

Flutter与原生的交互模型,类似于一种C-S模型。其中Flutter为Client层,原生为Server层,两者通过MethodChannel进行消息通信,原生端向Flutter提供已有的Native组件功能。

在客户端,MethodChannel允许发送与方法调用相对应的消息。
在平台方面,Android上的MethodChannel和iOS上的FlutterMethodChannel启用接收方法调用并返回结果。
这些类允许你使用非常少的"样板"代码开发平台插件。

Flutter与原生的消息传递采用标准信息编解码器,是一种相对高效的二进制序列化与反序列化。当接收跟发送消息时,这些值在消息中会自动进行序列化与反序列化。

6.1 什么是MethodChannel?

Flutter定义了3种channel模型:

  • BasicMessageChannel:用于传递字符串和半结构化的信息
  • MethodChannel:用于传递方法调用(method invocation)
  • EventChannel: 用于数据流(event streams)的通信
6.2 Flutter 与原生之间的通信流程

首先从dart层调用

_channel.invokeMethod("方法名",参数)
  • invoke方法会将传入的方法名与参数封装成MethodCall对象
  • 然后通过MethodCodec对MethodCall对象进行编码,形成二进制格式。
  • 然后通过BinaryMessenger的send方法,将二进制格式的数据进行发送
6.3 MethodChannel是什么时候注册,和MethodHandler联系起来的呢?

在插件运行的时候,我们会调用插件的registerWith方法,在生成MethodChannel对象时,同时向MethodChannel注册了一个MethodHandler,MethodHandler对象跟MethodChannel对象是一一对应的。

7、原生和Flutter之间数据交互的类型限制
8、插件包的发布

在发布Flutter插件时,可以使用appuploader工具来帮助处理iOS端的打包和上传工作。appuploader是一款专业的iOS开发辅助工具,可以简化证书管理、描述文件配置等繁琐流程,让开发者更专注于插件功能的实现。

Flutter 编写插件flutter_plugin(包含Android、iOS)实现过程

随着Flutter 日渐成熟,使用Flutter 也越来越多,作为一个跨平台的语言,他的展示效果和操作流畅度 可以和原生媲美,这也Flutter越来越受欢迎的原因。

虽然Flutter 越来越强大,但是总有一些力不从心的时候,现在大厂开发的SDK 如 极光推送、地图 等插件 并没有提供 Flutter版本,而我们使用的插件也是 一些开发者自己进行实现的,而对于一些冷门的插件,是根本没有,但是在开发过程中我们又要使用到。这个时候我们就要自己写一些插件了。

插件介绍

1、创建插件

这里我是不勾选的,使用java、oc,这个是否选择看大家习惯,这里我是不建议勾选的

点击完成后,插件就创建完成了。

2、插件目录

  • Android 就是我们开发安卓部分的位置
  • iOS 就是我们开发 iOS 的位置
  • lib 是与 Android 、iOS 联调的位置。也可以理解为Flutter 实现的位置
  • example 是测试的位置,当我们写完插件 可以直接运行 插件,example 可以理解为一个Flutter项目,只不过这个项目只给你写的插件服务

到此 插件就介绍了完了,下面开始进行代码实现。

Flutter部分
1、添加原生、Flutter交互渠道

我们打开插件,找到lib ,在lib下面会有一个文件 FlutterPluginTest_1,在这个基础上我们进行扩展,更加灵活

2、Flutter界面讲解

我们创建一个新类,叫TestView,位置和FlutterPluginTest_1并列即可。

3、Flutter调用

上面介绍到example是测试的地方,下面我就在这里进行使用,我们找main.dart,然后调用。

iOS、Android介绍
iOS部分

iOS 找到 ios 目录,选择Reveal in Finder,因为现在这个ios 部分还没有pod install,我们这要先进行pod install,成功后直接打开项目即可

Android 部分

Android 我们也右键在工具中打开,然后如下图找到位置,Android 所有的代码都在这里进行

iOS FlutterPluginTest_1Plugin
Android FlutterPluginTest_1Plugin(由于和iOS代码一致,这里不做过多介绍)
iOS TestFlutterPluginViewFactory
Android TestFlutterPluginViewFactory
iOS TestFlutterPluginView
Android TestFlutterPluginView

到此,插件的开发就算是完事了。实现的效果如下

下面就是使用这个插件了,我们如何集成到 别的项目里,在这里 我们只介绍 本地 使用

其实本地使用非常简单。

1、打开我们的项目
2、打开pubspec.yaml
3、引入依赖
4、pub get
到此就引用完成了。
5、使用我们就和example 里面一摸一样就可以了。

在开发过程中,如果需要将插件发布到App Store,可以使用appuploader来简化iOS端的打包和上传流程。appuploader提供了直观的界面操作,可以轻松管理证书、描述文件,并支持一键上传ipa文件到App Store Connect,大大提高了开发效率。

到此我们就完成了插件的 创建 和使用,大家有什么可以随时评论区留言。

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

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

相关文章

极狐GitLab 外部授权控制机制是怎样的?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 外部授权控制 (BASIC SELF) 在高度控制的环境中&#xff0c;访问策略可能需要由外部服务控制&#xff0c;该服务允许基于项目…

Linux系统之----冯诺依曼结构

1.简要描述 冯诺依曼体系结构是现代计算机的基本设计思想&#xff0c;其核心理念是将计算机的硬件和软件统一为一个整体&#xff0c;通过存储程序的方式实现计算。冯诺依曼体系结构的核心思想是通过存储程序实现自动计算&#xff0c;其五大部件协同工作&#xff0c;奠定了现代…

【八股】计算机网络

1 概述 1.1 网络的网络 网络把主机连接起来,而互连网(internet)是把多种不同的网络连接起来,因此互连网是网络的网络。而互联网(Internet)是全球范围的互连网。 1.2 ISP 互联网服务提供商 ISP 可以从互联网管理机构获得许多 IP 地址,同时拥有通信线路以及路由器等联…

基于VS Code 为核心平台的python语言智能体开发平台搭建

以下是基于 VS Code 为核心平台&#xff0c;整合 Node-RED、Gradio、Docker Desktop 的智能体可视化开发平台优化方案&#xff0c;聚焦工具链深度集成与开发效率提升&#xff1a; 一、核心架构设计 #mermaid-svg-f8l9kYPAlJ2TlpGF {font-family:"trebuchet ms",verd…

STM32G0单片机自带RTC

STM32有个自带RTC外设&#xff0c;外接32.768KHz的晶振后可得到相对精确的计时功能。 实测了一个一小时快个1秒多。 1 cubeMX设置了RTC后自动生成的初始化代码如下 static void MX_RTC_Init(void) {/* USER CODE BEGIN RTC_Init 0 *//* USER CODE END RTC_Init 0 */RTC_TimeT…

细说STM32单片机FreeRTOS任务管理API函数及多任务编程的实现方法

目录 一、FreeRTOS任务管理API函数 1、任务管理API函数 2、获取任务的句柄 &#xff08;1&#xff09;函数xTaskGetCurrentTaskHandle() &#xff08;2&#xff09;函数xTaskGetIdleTaskHandle() &#xff08;3&#xff09;函数xTaskGetHandle() 3、单个任务的操作 &a…

星露谷物语 7000+ 大型MOD整合包

衣服美化、家具美化、地图美化、人物肖像美化 全地图装修存档、人物美化、扩展包、环境美化、家具、动植物、通用前置包、新增NPC、功能、服装发饰妆 帽子发型农场小镇美化大型玩法拓展实用功能mod 动漫人物形象MOD 地点/动物/地图/功能/机械/家具/建筑/界面美化/扩展/农场/食谱…

C++ `unique_ptr` 多线程使用

C unique_ptr 多线程使用 一、核心结论 操作同一个 unique_ptr&#xff1a;必须加锁&#xff08;所有权转移是非原子操作&#xff09;访问被管理对象&#xff1a;若对象非线程安全&#xff0c;仍需额外同步独立 unique_ptr 实例&#xff1a;不同线程操作不同实例时无需加锁 二…

Android audio系统六 AudioEffect音效加载

对于Android系统智能硬件设备&#xff0c;音效处理的实现方式有以下几种&#xff1a; AudioEffect – android系统音效处理 优点&#xff1a;纯软件实现&#xff0c;移植调试简单方便 缺点&#xff1a;cpu上运行&#xff0c;容易因为资源竞争而出现卡顿 DSP/ADSP – 数字信号处…

深度学习总结(21)

超越基于常识的基准 除了不同的评估方法&#xff0c;你还应该了解的是利用基于常识的基准。训练深度学习模型&#xff0c;你听不到也看不到。你无法观察流形学习过程&#xff0c;它发生在数千维空间中&#xff0c;即使投影到三维空间中&#xff0c;你也无法解释它。唯一的反馈…

接口自动化测试(二)

一、接口测试流程&#xff1a;接口文档、用例编写 拿到接口文档——编写接口用例以及评审——进行接口测试——工具/自动化框架进行自动化用例覆盖(70%)——输出测试报告 自动化的目的一般是为了回归 第一件事情&#xff1a;理解需求&#xff0c;学会看接口文档 只需要找到我…

Linux上位机开发实践(以MCU小系统入门嵌入式电路)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 一直都主张嵌入式软件工程师&#xff0c;也要会做一点电路设计的工作。哪怕自己做的是嵌入式linux上层开发&#xff0c;一个会硬件设计&#xff0c…

浏览器的存储机制 - Storage

浏览器的存储机制 - Storage 前言一、核心概念与区别二、常用 API1、存储数据&#xff08;setItem(key, value)&#xff09;2、 获取数据&#xff08;getItem(key)&#xff09;3、删除单个数据&#xff08;removeItem(key)&#xff09;4、清空所有数据&#xff08;clear()&…

考研单词笔记 2025.04.18

chance n机会&#xff0c;风险&#xff0c;冒险&#xff0c;可能性&#xff0c;巧合&#xff0c;意外a偶然的&#xff0c;意外的 opportunity n机会&#xff0c;时机 crisis n危机&#xff0c;危急关头 the economic crisis 经济危机 danger n危险&#xff0c;可能性&#…

第三方API——Spring Boot 集成阿里云短信发送功能

目录 一. 创建阿里云OSS服务并获取密钥&#xff0c;开通短信服务 1.1 注册阿里云服务器 1.2 开通短信服务 1.3 创建对象存储OSS服务 1.4 RAM用户授权短信权限 1.5 新增用户并授权用户短信权限 1.6 获取 AccessKey ID 和 AccessKey Secret 二. 创建项目集成短信发送 2.1…

b站PC网页版视频播放页油猴小插件制作

文章目录 前言需求分析实施观察页面起始渲染编码效果展示 总结 前言 新手上路,欢迎指导 需求分析 想要一个简约干净的界面,需要去除推荐栏和广告部分. 想要自由调节视频播放速率,需要在视频控制栏加一个输入框控制视频倍速 实施 观察页面起始渲染 因为要使用MutationObse…

畅游Diffusion数字人(27):解读字节跳动提出主题定制视频生成技术Phantom

畅游Diffusion数字人(0):专栏文章导航 前言:主题定制视频生成,特别是zero-shot主题定制视频生成,一直是当前领域的一个难点,之前的方法效果很差。字节跳动提出了一个技术主题定制视频生成技术Phantom,效果相比于之前的技术进步非常显著。这篇博客详细解读一下这一工作。 …

ESP8266简单介绍

ESP8266模块图如下 ESP8266的工作模式有三种 ESP8266支持STA、AP、STAAP三种工作模式 ①STA模式 &#xff08;ESP充当设备与路由器相连&#xff09; ②AP模式 &#xff08;ESP充当路由器&#xff09; ③APSTA&#xff08;上述两种模式兼具&#xff09; AT指令介绍 使用安…

DeepSeek-R3、GPT-4o 与 Claude-3.5-Sonnet 全面对比:性能、应用场景与技术解析

随着大模型技术的迅猛发展&#xff0c;国产模型正逐渐崭露头角&#xff0c;尤其是DeepSeek-R3的发布&#xff0c;更是在AI技术社区中引起广泛关注。而与此同时&#xff0c;国际领先的GPT-4o和Claude-3.5-Sonnet也在不断迭代升级&#xff0c;持续刷新业界对AI能力的认知。下文将…

城市街拍暗色电影胶片风格Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色介绍 城市街拍暗色电影胶片风格 Lr 调色&#xff0c;是借助 Adobe Lightroom 软件&#xff0c;为城市街拍的人像或场景照片赋予独特视觉风格的后期处理方式。旨在模拟电影胶片质感&#xff0c;营造出充满故事感与艺术感的暗色氛围&#xff0c;让照片仿佛截取于某部充满张力…