Flutter插件的制作和发布

news2024/11/26 21:19:55

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中添加实现方法:

  @override
  Future<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查看你的插件了!

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

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

相关文章

《深入PostgreSQL的存储引擎:原理与性能》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

Multisim14.0仿真(十四)电压跟随器

一、仿真原理图&#xff1a; 二、仿真效果图&#xff1a;

Ae 效果详解:CC Pixel Polly

模拟/CC Pixel Polly Simulation/CC Pixel Polly CC Pixel Polly&#xff08;CC 像素多边形&#xff09;基于源图像分解成多个破碎的像素多边形&#xff0c;无需设置关键帧自动生成碎片飞散的动画效果。 ◆ ◆ ◆ 效果属性说明 Force 力量 用于控制像素分解的力量大小。 默认…

Mybatis懒加载

懒加载是什么&#xff1f; 按需加载所需内容&#xff0c;当调用到关联的数据时才与数据库交互否则不交互&#xff0c;能大大提高数据库性能&#xff0c;并不是所有场景下使用懒加载都能提高效率。 Mybatis懒加载&#xff1a;resultMap里面的association、collection有延迟加载功…

宋浩概率论笔记(八)假设检验

宋浩系列全系列的最后一更&#xff01; 本章考察频率很低&#xff0c;核心在于记忆检验不同参数时用到的分布~

定积分的应用:几何应用与物理应用

目录 几何应用 计算平面图形的面积 计算旋转体的面积 计算曲线弧长 物理应用 几何应用 计算平面图形的面积 定积分在平面图形的面积计算中具有广泛的应用。通过定积分&#xff0c;你可以计算出曲线图形下的面积&#xff0c;从而求解各种复杂形状的区域面积。以下是一些常…

80端口被占用

winR输入&#xff1a;services.msc进入服务窗口 找到SQL Server Reporting Services &#xff0c;右键“属性”停止服务

“哪李贵了”主播带货电商被喷,说到底还是服务问题

近日&#xff0c;李佳琦在带货某品牌眉笔时发表的相关言论引发争议。 9月10日晚&#xff0c;李佳琦在直播间带货国货美妆品牌花西子眉笔时&#xff0c;有网友质疑79元一支的眉笔涨价&#xff0c;李佳琦先是解释花西子有多不容易&#xff0c;“哪里贵了&#xff1f;这么多年都是…

到底适不适合报考浙大MPA项目?这个角度评估比较客观

现今的浙大mpa项目招生可以说是如日中天&#xff0c;2023年1900报考量创造历史最高&#xff0c;也把浙大mpa招生复试自划线顶的老高&#xff0c;200的分数只能碰得到复试资格&#xff0c;距离录取结果还有不少悬念&#xff0c;因此报考浙大mpa项目目前最好的办法是提面冲击A资格…

【力扣每日一题】2023.9.14 可以攻击国王的王后

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们皇后和国王的坐标&#xff0c;问我们哪些皇后可以攻击到国王。 这个应该是国际象棋的走子规则&#xff0c;皇后的攻击范围在跟皇后…

阿里云CDN缓存配置及优化

参考阿里云官网文档&#xff1a;https://help.aliyun.com/practice_detail/603170 缓存时间配置 在缓存管理中&#xff0c;可以方便地指定目录和文件后缀名在CDN节点上的缓存时间&#xff0c;缓存时长配置的长短&#xff0c;取决于源站对该文件的变更频率。我们需要分析下业务中…

存储创新靠软件?

IT产业在经历10多年的狂飙后&#xff0c;近两年在创新速度上看似开始"乏力"&#xff0c;即使iPhone&#xff0c;每一次发布会后也被吐槽缺乏创新。 其实&#xff0c;IT产品在过去十多年的快速发展后&#xff0c;的确在硬件发展方面遇到了一些瓶颈。但一个产品创新能…

【论文阅读】MARS:用于自动驾驶的实例感知、模块化和现实模拟器

【论文阅读】MARS&#xff1a;用于自动驾驶的实例感知、模块化和现实模拟器 Abstract1 Introduction2 Method2.1 Scene Representation2.3 Towards Realistic Rendering2.4 Optimization3.1 Photorealistic Rendering3.2 Instance-wise Editing3.3 The blessing of moduler des…

怎么压缩视频?视频过大跟我这样压缩

在日常生活中&#xff0c;我们常常会遇到需要上传或者发送视频的情况&#xff0c;然而&#xff0c;有时候视频文件过大&#xff0c;无法顺利上传或发送&#xff0c;这时候就需要对视频进行压缩。那么&#xff0c;如何有效地压缩视频呢&#xff1f;看完下面三个方法你就明白了。…

在四维轻云中,能够上传哪些地理空间数据?

四维轻云是一款地理空间数据在线管理软件&#xff0c;支持各类地理空间数据的在线管理、浏览及分享&#xff0c;用户可不受时间地点限制&#xff0c;随时随地上传、管理、查看及分享各类地理空间数据。软件还具有项目管理、场景搭建、素材库等功能模块&#xff0c;支持在线协作…

软件测试/测试开发名企定向培养训练营,升职加薪快人一步!

测试人员如何提升核心竞争力 作为一个测试工程师&#xff0c;自动化测试已经是必须要掌握的技能了。学习自动化测试有两个难点&#xff0c;除了其本身拥有一定的技术门槛之外&#xff0c;实战经验才是学习自动化测试的最大难点。部分初中级测试工程师往往在掌握了基本的编程与…

jupyter notebook找不到python内核(kernel)的解决记录

文章来源&#xff1a;jupyter notebook找不到python内核(kernel)的解决记录 – WhiteNights Site 貌似导致这个问题的原因有非常多&#xff0c;这里只是说一个可能的解决方法。 前情提要&#xff1a;在费了九牛二虎之力&#xff0c;终于安装成功了jupyter notebook&#xff0c;…

ubuntu设置初始的root密码

在用vmware安装ubuntu的虚拟机后&#xff0c;只有初始设置的用户和密码&#xff0c;当进入系统后使用su切换成root账户后&#xff0c;要求输入密码&#xff0c;但输入安装时设置的用户密码不对&#xff0c;需要设置初始的root密码。 解决&#xff1a; 1、使用安装时候的用户登…

一份责任、一个意识、一种情怀,名酒担当剑南春擦亮公益品牌,连续8年助力“高考”!

海南八月&#xff0c;椰风海韵&#xff0c;青春飞扬。 来自全国各地的150余名准大学新生&#xff0c;齐聚南海之滨&#xff0c;开启“剑南春2023强国青年爱国之旅西沙群岛游”。 知名教育专家张雪峰启航致辞、三沙市银屿岛升旗仪式、西沙群岛特别课程《照见未来的一节课》、中…

Java“牵手”唯品会商品详情数据,唯品会商品详情接口,唯品会API接口申请指南

唯品会商城是中国最大的会员制特卖电商平台之一&#xff0c;于2008年创立。它以低至1折的深度折扣及充满乐趣的限时抢购模式&#xff0c;为消费者提供一站式优质购物体验。 唯品会定位于"一家专门做特卖的网站"&#xff0c;每天上新品。它与全球3000多家品牌及供应商…