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

Flutter插件的制作和发布

Flutter制作插件有两种方式(以下以android和ios为例):

目录

  • 1.直接在主工程下的android和ios项目内写插件代码:
  • 2.创建独立Flutter Plugin项目,制作各端插件后,再引入项目:
    • 1. 创建Flutter Plugin:
    • 2. Flutter Plugin创建完成:
    • 3. 使用android studio打开主工程(example)下的android工程,编写安卓端插件代码:
      • 在onMethodCall中编写你自己的方法,我这里新增一个test方法:
      • 在实现类plugin_example_method_channel.dart中添加实现方法:
      • 在plugin_example.dart中添加调用方法:
      • 在main.dart中测试方法:
    • 4. 使用XCode打开主工程(example)下的ios工程,编写IOS端插件代码:
      • 执行flutter pub get
      • 修改sdk版本号
      • 配置flutter sdk路径
      • 删除 integration_test
      • xcode打开ios工程并编写代码
  • 发布插件

1.直接在主工程下的android和ios项目内写插件代码:

在这里插入图片描述
可以使用Android Studio和Xcode分别打开android和ios项目,并进行代码编写以及插件的引用,这种方式属于直接集成在自己的项目内,需自己定义插件名称,channel名称,以及flutter端和原生端通信的相关方法。

优点:
- 接入方式简单;
缺点:
- 接入过程稍麻烦,需要自己定义及编写通信相关代码;
- 对于通用插件无法直接提供给其它项目共享;

2.创建独立Flutter Plugin项目,制作各端插件后,再引入项目:

1. 创建Flutter Plugin:

在这里插入图片描述
注意圈着的部分,工程类型一定要选择Plugin,然后填写包名,选择开发语言,对于开发语言的选择有几点建议:如果你将要制作的插件没有引入第三方sdk,或者只引入了一些工具类的库,那么根据你熟悉或喜欢的语言随意选择;但如果你需要引入第三方sdk(特别是ios的sdk使用的是oc编写),建议选择java和oc,因为目前为止,大部分的第三方sdk仍然是以java和oc语言开发为主,这样你在参考sdk文档时,很多代码可以直接复制,会节省不少时间

2. Flutter Plugin创建完成:

在这里插入图片描述
创建完成后,可以看到目录结构,plugin_example就是你的插件住工程,将来其它项目引入时就是引入的plugin_example,打开lib文件夹,有三个文件:

  • plugin_example.dart:插件外显名称(PluginExample,使用插件时new的插件对象);
  • plugin_example_method_channel.dart:通信通道,主要在这里注册channel和调用原生方法;
  • plugin_example_platform_interface.dart:通信接口,plugin_example_method_channel是他的实现类,类似java的interface和impl;

示例中提供了一个获取当前系统平台版本号的一个方法getPlatformVersion,我们按照这个示例编写自己的方法即可,而plugin_example下的example工程则是插件使用示例项目,可以让你直接运行项目进行插件调试。

最终的插件代码使用示例:

import 'package:plugin_example/plugin_example.dart';
...
final _pluginExamplePlugin = PluginExample();
...
_pluginExamplePlugin.getPlatformVersion();

当前整个项目结构,是主工程被包含在了插件工程内部:

在这里插入图片描述

如果我有多个插件怎么办?一个主工程也不可能被多个插件包含啊!不用担心,插件的引用只需要你配置好引用路径即可,至于插件放在哪个位置那得看你自己了,一般的为了查看方便以及结构合理性,我们可以反过来,把插件放入主工程目录下,然后修改下引用路径即可(关闭AS,自行移动文件夹位置,然后修改引入路径):

在这里插入图片描述

这样是不是看着就顺眼多了,引入的各个插件一目了然!

3. 使用android studio打开主工程(example)下的android工程,编写安卓端插件代码:

在这里插入图片描述

打开后可能需要等待AS配置安卓环境~

在这里插入图片描述

上面的android即插件工程,下面的android则是安卓主工程,现在你就可以打开插件主类编写代码了:

在这里插入图片描述

channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "plugin_example");

channnel的名称默认即可,跟你创建插件时填入的插件项目名称一致,最好不要修改!

在onMethodCall中编写你自己的方法,我这里新增一个test方法:

 else if (call.method.equals("test")) {String param = (String) call.arguments;Map<String, Object> map = new HashMap<>();map.put("code", 0);map.put("msg", "Test Success:" + param);result.success(map);
}

在plugin_example_platform_interface.dart中添加test方法:

  Future<Map?> test(param) {throw UnimplementedError('test() has not been implemented.');}

注意,Future<Map?>表示此方法返回值类型是Map,这个需要根据你自己的返回值类型而定,一般用Map最多,因为你可能不止返回一个参数!

在实现类plugin_example_method_channel.dart中添加实现方法:

  @overrideFuture<Map?> test(param) async {final map = await methodChannel.invokeMethod<Map>('test',param);return map;}

在plugin_example.dart中添加调用方法:

  Future<Map?> test(param) {return PluginExamplePlatform.instance.test(param);}

注意:当你增加方法后,test文件可能会报错,你可以根据提示添加方法,或直接将test删除即可!

在main.dart中测试方法:

我这里直接修改了原来获取版本的示例方法:

  Future<void> initPlatformState() async {Map? platformVersion = await _pluginExamplePlugin.test("123");if (!mounted) return;setState(() {_platformVersion = platformVersion.toString();});}

运行:

在这里插入图片描述

与插件方法返回一致,成功:

else if (call.method.equals("test")) {String param = (String) call.arguments;Map<String, Object> map = new HashMap<>();map.put("code", 0);map.put("msg", "Test Success:" + param);result.success(map);
}

4. 使用XCode打开主工程(example)下的ios工程,编写IOS端插件代码:

我们编写插件时应遵循一个原则,即先完成一端的插件编写,将所有需要使用的方法编写调试完成,再编写另一端。如我先将android端的插件编写完成,且flutter端的调用方法也已实现,那么在编写ios端代码时,就只用考虑实现andorid端编写的方法即可,方法编写完成,就可直接运行,因为flutter的调用逻辑都以实现!

我们在用xcode打开ios工程前,要确保你的mac中已经安装了flutter和cocoapods环境,因为flutter plugin是以pods方式集成的,确认没问题后,可以先使用mac端AS打开项目,并运行,这时AS会自动执行pod install,并自动配置项目的xcode环境。

执行flutter pub get

AS打开项目后,先执行flutter pub get 配置flutter环境:

在这里插入图片描述

报错了,意思是项目要求dart版本不能低于3.1.0,但我dart版本是3.0.6,这是因为如果你调试安卓和ios不在同一台电脑导致的,只需将主工程和插件工程下的pubspec.xml的sdk版本调低即可:

修改sdk版本号

environment:sdk: '>=3.0.0 <4.0.0'

再次执行flutter pub get,成功!但此时我们可能发现还是无法运行:

在这里插入图片描述

这是因为我们没有给该项目指定flutter sdk路径:

配置flutter sdk路径

在这里插入图片描述

这种情况经常出现在现在windows环境下调试安卓,然后又将项目发送到了mac上调试ios时出现!

指定完sdk路径,项目即可运行,点击运行,报错:

在这里插入图片描述
此时我们将test相关全部删除掉,没什么用,又经常报错,耽误时间(如果你需要test那另当别论):

删除 integration_test

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

运行成功,但控制台报错找不到方法:

在这里插入图片描述
找不到方法就对了,因为我们还没开始编写ios端插件代码呢,此时便可使用xcode打开ios项目了:

xcode打开ios工程并编写代码

在这里插入图片描述

双击运行:

在这里插入图片描述

我们在PluginExamplePlugin.m中编写代码,实现test方法,在handleMethodCall方法中添加:

else if ([@"test" isEqualToString:call.method]) {NSString *param=call.arguments;result(@{@"code":@0,@"msg":[NSString stringWithFormat:@"Test Success:%@",param]});} 

再次运行:

在这里插入图片描述
成功!

此时,一个完整的android和ios双端插件就只做完成了,当其他项目使用时,可以直接复制引入即可,若你想公开此插件,给更多人使用,那么就可以发布到https://pub.dev/上。

发布插件

终端进入插件根目录,执行命令:

flutter packages pub publish --dry-run

在这里插入图片描述

报错,意思是homepage没有设置,我们可以设置一下(可以设置为你的github项目地址):

在这里插入图片描述
另外,你也可以为你的插件添加开源协议LICENSE,如果不知道怎么写,可以复制别人的,或者自己在github上创建一个带LICENSE的空项目复制进来,然后再次执行命令:

在这里插入图片描述

已经没问题了,可以发布了:

flutter packages pub publish --server=https://pub.dartlang.org

Do you want to publish plugin_example 0.0.1 to https://pub.dev (y/N)? 输入y:

在这里插入图片描述

复制链接在浏览器打开,登录谷歌账号就行插件相关配置操作…

此处省略一万字,如果你能解决qiang的问题,那么当出现Successfully uploaded package时,就表示插件已发布成功,你就可以进入https://pub.dartlang.org/packages/xxx查看你的插件了!

相关文章:

Flutter插件的制作和发布

Flutter制作插件有两种方式&#xff08;以下以android和ios为例&#xff09;&#xff1a; 目录 1.直接在主工程下的android和ios项目内写插件代码&#xff1a;2.创建独立Flutter Plugin项目&#xff0c;制作各端插件后&#xff0c;再引入项目&#xff1a;1. 创建Flutter Plugin…...

【JAVA】异常

作者主页&#xff1a;paper jie 的博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《JAVASE语法系列》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和…...

合同矩阵充要条件

两个实对称矩阵合同的充要条件是它们的正负惯性指数相同。 正惯性指数是矩阵正特征值个数&#xff0c;负惯性指数是矩阵负特征值个数。 即合同矩阵的充分必要条件是特征值的正负号个数相同。 证明&#xff1a; 本论证中的所有矩阵都是对称矩阵。 根据定义&#xff0c;若矩…...

数据分析三剑客之Pandas

1.引入 前面一篇文章我们介绍了numpy&#xff0c;但numpy的特长并不是在于数据处理&#xff0c;而是在它能非常方便地实现科学计算&#xff0c;所以我们日常对数据进行处理时用的numpy情况并不是很多&#xff0c;我们需要处理的数据一般都是带有列标签和index索引的&#xff0…...

Spring Boot自动装配原理

简介 Spring Boot是一个开源的Java框架&#xff0c;旨在简化Spring应用程序的搭建和开发。它通过自动装配的机制&#xff0c;大大减少了繁琐的配置工作&#xff0c;提高了开发效率。本文将深入探讨Spring Boot的自动装配原理。 自动装配的概述 在传统的Spring框架中&#xf…...

VMware Workstation虚拟机网络配置及配置自动启动

目录 一、网络配置二、配置自动启动1.VMware 中配置虚拟机自启动2.系统服务中配置 VMware 服务自启动 一、网络配置 本文将虚拟机 IP 与主机 IP 设置为同一个网段。 点击 “编辑” -> “虚拟网络编辑器(N)…”&#xff1a; 点击 “更改设置”&#xff1a; 将 VMnet0 设置…...

智能语音机器人竞品调研

一、腾讯云-智能客服机器人 链接地址&#xff1a;智能客服机器人_在线智能客服_智能客服解决方案 - 腾讯云 二、阿里云-智能语音机器人 链接地址&#xff1a;智能对话机器人-阿里云帮助中心 链接地址&#xff1a;智能外呼机器人的业务架构_智能外呼机器人-阿里云帮助中心 三、火…...

【操作系统】进程的概念、组成、特征

概念组成 程序&#xff1a;静态的放在磁盘&#xff08;外存&#xff09;里的可执行文件&#xff08;代码&#xff09; 作业&#xff1a;代码&#xff0b;数据&#xff0b;申请&#xff08;JCB&#xff09;&#xff08;外存&#xff09; 进程&#xff1a;程序的一次执行过程。 …...

大二第二周总结

问题&#xff1a; 想到了之前追的辩论赛&#xff0c;主题是“被误解是表达者的宿命”&#xff0c; 反方认为被误解不是表达者的宿命&#xff1a; 由于表达者表意含混造成误解的可能性是人力可控的&#xff0c;表达者可在真诚沟通的基础之上&#xff0c;根据对方反应不断调整…...

JDK、eclipse软件的安装

一、打开JDK安装包 二、复制路径 三、点击我的电脑&#xff0c;找到环境变量 四、新建环境 变量名&#xff1a;JAVA_HOME 变量值就是刚刚复制的路径 五、在path中建立新变量 双击path 打印以下文字 最后一直双击确定&#xff0c;安装环境完成。 六、双击eclipse 选择好安装…...

235. 二叉搜索树的最近公共祖先 Python

文章目录 一、题目描述示例 1示例 2 二、代码三、解题思路 一、题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足…...

Apollo介绍和入门

文章目录 Apollo介绍配置中心介绍apollo介绍主流配置中心功能特性对比 Apollo简介 入门简单的执行流程Apollo具体的执行流程Apollo对象执行流程分步执行流程 核心概念应用&#xff0c;环境&#xff0c;集群&#xff0c;命名空间企业部署方案灰度发布全量发布 配置发布的原理发送…...

一文看懂Oracle 19c OCM认证考试(需要Oracle OCP证书)

Oracle OCM的认证全称是Oracle Certified Master&#xff0c;是比OCP更高一级的认证&#xff0c;姚远老师的很多OCP学员都对OCM考试有兴趣&#xff0c;这里跟大家做个介绍。 OCM考试全部是上机的实操考试&#xff0c;没有笔试&#xff0c;要到Oracle原厂参加两天的考试。参加1…...

回归预测 | MATLAB实现PSO-SDAE粒子群优化堆叠去噪自编码器多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现PSO-SDAE粒子群优化堆叠去噪自编码器多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现PSO-SDAE粒子群优化堆叠去噪自编码器多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览…...

python自学

自学第一步 第一个简单的基础&#xff0c;向世界说你好 启动python 开始 print是打印输出的意思&#xff0c;就是输出引号内的内容。 标点符号必须要是英文的&#xff0c;因为他只认识英文的标点符号。 exit&#xff08;&#xff09;推出python。 我们创建一个文本文档&…...

元宇宙安全与著作权相关市场与技术动态:韩国视角

元宇宙市场动态 元宇宙安全与著作权维护技术现状 元宇宙有可能为商业创造巨大价值&#xff0c;尤其是在零售和时尚领域。时尚产品的象征性价值不仅在物理空间中得以保持&#xff0c;在虚拟空间中也是如此。通过元宇宙平台&#xff0c;企业可以开发虚拟产品&#xff0c;降低供…...

springboot整合neo4j--采用Neo4jClient和Neo4jTemplate方式

1.背景 看了spring-boot-starter-data-neo4j的源码之后发现&#xff0c;该starter内已经实现了Neo4jClient和Neo4jTemplate&#xff0c;我们只需要使用Autowire就能直接使用它操作neo4j。 Neo4jClient方式与我的另一篇springboot整合neo4j-使用原生cypher Java API博客方式一样…...

【算法与数据结构】701、LeetCode二叉搜索树中的插入操作

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;这道题关键在于分析插入值的位置&#xff0c;不论插入的值是什么&#xff08;插入值和原有树中的键值都…...

前端--HTML

文章目录 HTML结构快速生成代码框架HTML常见标签 表格标签 编写简历信息 填写简历信息 Emmet 快捷键 HTML 特殊字符 一、HTML结构 1.认识HTML标签 HTML 代码是由 "标签" 构成的. 形如: <body>hello</body> 标签名 (body) 放到 < > 中 大部分标…...

安装配置 zookeeper(单机版)

目录 一 准备并解压安装包 二 修改zoo.cfg文件 三 创建相应两个目录 四 创建文件myid 五 修改环境变量 六 启动 zookeeper 一 准备并解压安装包 这里提供了网盘资源 http://链接: https://pan.baidu.com/s/1BybwSQ_tQUL23OI6AWxwFw?pwdd4cf 提取码: d4cf 这里的安装包是…...

2023/9/7 -- C++/QT

作业 1> 思维导图 2> 封装一个结构体&#xff0c;结构体中包含一个私有数组&#xff0c;用来存放学生的成绩&#xff0c;包含一个私有变量&#xff0c;用来记录学生个数&#xff0c; 提供一个公有成员函数&#xff0c;void setNum(int num)用于设置学生个数 提供一个…...

2023年09月IDE流行度最新排名

点击查看最新IDE流行度最新排名&#xff08;每月更新&#xff09; 2023年09月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多&#xff0c;这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&am…...

MyBatis基础之概念简介

文章目录 基本概念1. 关于 MyBatis2. MyBatis 的体系结构3. 使用 XML 构建 SqlSessionFactory4. SqlSession5. 默认的别名6. 补充 [注意] 放前面前 很多人可能在使用 MyBatis-plus 进行代码开发&#xff0c;MyBatis的这部分内容是用来更好的讲述之后的内容。 基本概念 1. 关于…...

解决 SQLyog 连接 MySQL8.0+ 报错:错误号码2058

文章目录 一、问题现象二、原因分析三、解决方案1. 方案1&#xff1a;更新SQLyog版本2. 方案2&#xff1a;修改用户的授权插件3. 方案3&#xff1a;修复my.cnf 或 my.ini配置文件 四、最后总结 本文将总结如何解决 SQLyog 连接 MySQL8.0 时报错&#xff1a;错误号码2058 一、问…...

Linux内核4.14版本——drm框架分析(11)——DRM_IOCTL_MODE_ADDFB2(drm_mode_addfb2)

目录 1. drm_mode_addfb2 2. drm_internal_framebuffer_create 3. drm_fb_cma_create->drm_gem_fb_create->drm_gem_fb_create_with_funcs 4. drm_gem_fb_alloc 4.1 drm_helper_mode_fill_fb_struct 4.2 drm_framebuffer_init 5. 调用流程图 书接上回&#xff0c;使…...

mysql的date_format()函数格式月份的坑

问题背景 我表中有个字段存的是“年-月”格式的字符串&#xff0c;格式是这样的&#xff1a;‘2023-08’ 在查询这个表数据时&#xff0c;我使用了如下sql语句&#xff1a; select * from car where date_format(car_start_month,%Y-%m)<2023-08 意思是查询 car_start_mo…...

保姆级式教程:教你制作电子画册

在这个数字化时代&#xff0c;电子画册成为了展示和分享作品的一种流行方式。制作一个精美的电子画册不仅可以展示你的创意和才华&#xff0c;还可以吸引更多人的关注和欣赏。下面告诉大家一些小步骤&#xff0c;带你一步步学习如何制作电子画册。 1.收集和整理作品 接下来&am…...

探究Nginx应用场景

1 静态资源 Nginx是一个流行的Web服务器和反向代理服务器&#xff0c;它可以用于托管静态资源。下面是一个简单的案例&#xff0c;展示了如何使用Nginx来提供静态资源。 假设你有一个名为example.com的域名&#xff0c;并且你希望使用Nginx来托管位于/var/www/html目录下的静…...

sklearn中的数据集使用

导库 from sklearn.datasets import load_iris 实现 # 加载数据集 iris load_iris() print(f查看数据集&#xff1a;{iris}) print(f查看数据集的特征&#xff1a;{iris.feature_names}) print(f查看数据集的标签&#xff1a;{iris.target_names}) print(f查看数据集的描述…...

LLM在电商推荐系统的探索与实践

本文对LLM推荐的结合范式进行了梳理和讨论&#xff0c;并尝试将LLM涌现的能力迁移应用在推荐系统之中&#xff0c;利用LLM的通用知识来辅助推荐&#xff0c;改善推荐效果和用户体验。 背景 电商推荐系统&#xff08;Recommend System&#xff0c;RecSys&#xff09;是一种基于用…...

网站更换服务器 备案/高级seo

XML是一种可扩展的标记语言&#xff0c;比之之前谈到的html有着很大的灵活性&#xff0c;虽然它只是与HTML仅有一个字母只差&#xff0c;但两者有很大的区别。 XML也是标记语言&#xff0c;所以它每个标签必须要闭合&#xff0c;而HTML偶尔忘了闭合也没有多大的影响(这里也不建…...

网站建设技术百科/网络推广培训课程内容

GORM查询 GORM提供了从动态查询器到criteria到Hibernate面向对象查询语言HQL的一系列查询方式. Groovy通过 GPath 操纵集合的能力, 和GORM的像sort,findAll等方法结合起来&#xff0c;形成了一个强大的组合. 但是&#xff0c;让我们从基础开始吧. 获取实例列表 如果你简单的需…...

房地网站制作/2345网址导航下载桌面

你鼓捣完了那20个HTTP请求,安装的过程如果,提示python[api]错误rpm -Uvh python* --no-deps后面的 --no-deps在我的机器上没用,所以我去掉了太刺激了,现在是凌晨3:09.你可以根据你的机器型号去找源码包.CSDN有时候还是管用的.最起码有个思路.倒霉啊,修改下面这个文件.修改这个文…...

定制型网站制作价格/网络营销与电子商务的区别

本文介绍安装和使用GreenWithEnvy的方法&#xff0c;以能够在Linux操作系统上超频Nvidia显卡&#xff0c;在所有其他GPU供应商中&#xff0c;Nvidia为Linux平台提供了不错的图形驱动程序&#xff0c;允许游戏在平台上运行。尽管如此&#xff0c;由于Linux的基础技术&#xff0c…...

cc域名 网站使用美国的空间需要备案吗/百度营销登录入口

ACM模式下的常见输入输出AB(1)AB(2)AB(3)AB(4)AB(5)AB(6)AB(7)字符串排序(1)字符串排序(2)字符串排序(3)明天是第一次参加互联网大厂笔试机考&#xff0c;所以练习一下牛客网上ACM模式的常见输入和输出&#xff0c;防止明天出岔子AB(1) while True:try:a,b map(int,input().sp…...

有什么网站做的比较高大上/网址大全导航

http://blog.csdn.net/ivy_feifei/article/details/41543051...