Flutter插件的制作和发布

2023-09-14 13:10:44

Flutter制作插件有两种方式(以下以android和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查看你的插件了!

更多推荐

SpringBoot + Prometheus + Grafana 打造可视化监控

SpringBoot+Prometheus+Grafana打造可视化监控文章目录SpringBoot+Prometheus+Grafana打造可视化监控常见的监控组件搭配安装Prometheus安装Grafana搭建SpringBoot项目引入依赖示例:监控SpringBoot内置Tomcat线程池的情况grafana

从实时监控到智能洞察:Grafana 和 CnosDB 的无限潜力

在今天的数字化世界中,监控系统对于维护应用程序和基础设施的稳定性至关重要。本文将介绍如何使用Grafana和CnosDB构建强大的监控体系,以便实时监视性能、发现问题并采取及时的措施。CnosDB已正式上架Grafana插件市场Grafana:开源监控和仪表工具Grafana是一款流行的开源监控和仪表工具,它提供了丰富

传统制造型企业如何实现数字化转型?

传统制造企业可以通过采用技术和数据驱动的方法来实现数字化转型,以改善运营、提高效率并在快速发展的行业中保持竞争力。以下是他们可以遵循的步骤和策略:1.评估和战略制定:评估当前状态:首先评估制造流程、技术基础设施和数据管理系统的当前状态。确定需要改进的领域。定义目标:明确定义数字化转型的目的和目标。你想实现什么目标?它可

7年阿里测试经验之谈 —— 用UI自动化测试实现元素定位

随着IT行业的发展,产品愈渐复杂,web端业务及流程更加繁琐,目前UI测试仅是针对单一页面,操作量大。为了满足多页面功能及流程的需求及节省工时,设计了这款UI自动化测试程序。旨在提供接口,集成到蜗牛自动化测试框架,方便用例的设计。目前,在自动化测试的实际应用中,接口自动化测试被广泛使用,但UI自动化测试也并不会被替代。

五分钟k8s实战-使用Ingress

ingress.png背景前两章中我们将应用部署到了k8s中,同时不同的服务之间也可以通过service进行调用,现在还有一个步骤就是将我们的应用暴露到公网,并提供域名的访问。这一步类似于我们以前配置Nginx和绑定域名,提供这个能力的服务在k8s中成为Ingress。通过这个描述其实也能看出Ingress是偏运维的工

Foxit PDF SDK Windows 9.1 Crack

FoxitPDFSDK变更日志Windows/Linux/Mac2023年8月新功能/增强功能在开始签名之前设置外观。支持使用共享字典添加签名。允许在调用Signature::StartSign()之前增量保存文档。在签名前修改现有未签名分页印章签名的外观。支持使用共享字典添加分页签名。忽略全角字符搜索。删除无效的PD

HTTP反爬困境

尊敬的程序员朋友们,大家好!今天我要和您分享一篇关于解决反爬困境的文章。在网络爬虫的时代,许多网站采取了反爬措施来保护自己的数据资源。然而,作为程序员,我们有着聪明才智和技术能力,可以应对这些困境并确保数据的安全性。本文将重点介绍如何通过HTTP协议和IP地址来应对反爬挑战,让我们一起深入探讨吧!1.了解HTTP协议H

Jenkins自动化测试

学习Jenkins自动化测试的系列文章RobotFramework概念RobotFramework安装Pycharm+RobotFramework环境搭建RobotFramework介绍Jenkins自动化测试1.RobotFramework概念RobotFramework是一个基于Python的,可扩展的关键字驱动的

nginx配置指南

nginx.conf配置找到Nginx的安装目录下的nginx.conf文件,该文件负责Nginx的基础功能配置。配置文件概述Nginx的主配置文件(conf/nginx.conf)按以下结构组织:配置块功能描述全局块与Nginx运行相关的全局设置events块与网络连接有关的设置http块代理、缓存、日志、虚拟主机等

RISV-V架构的寄存器介绍

1、RISC-V的通用寄存器(1)在编写汇编代码时,使用寄存器的ABI名字,一般不直接使用寄存器的编号;(2)x0-x31是用来做整形运算的寄存器,f0-f31是用来做浮点数运算的寄存器;RISC-V一定有x0-x31寄存器,但是不一定有f0-f31寄存器,这要看支不支持浮点数运算;(3)保存者:调用者保存就是在函数跳

关系型数据库和非关系型数据库

关系型数据库和非关系型数据库关系型数据库非关系型数据库非关系型数据库和关系型数据库是两种不同类型的数据库管理系统,它们用于存储和管理数据,但在数据组织和处理方式上有一些重要的区别。关系型数据库1.结构化数据存储:关系型数据库以表格形式存储数据,数据以行和列的方式组织,每个表都有预定义的模式(也称为模式或架构),这意味着

热文推荐