从头开发一个Flutter插件(一)开发流程

flutter package

Posted by Kinsomy on November 5, 2018

文章由来

在上一篇分享的文章Flutter 天气应用里我介绍了一个用flutter编写的天气预报app,里面有一个需要完善的功能就是根据当前定位所在城市显示天气信息。由于没有办法使用gms(google mobile service)的缘故,flutter官方提供的基于Google map的定位package没有办法直接引入到项目中使用,因此我就想到基于高德地图的sdk来做一款相同的插件,既可以为天气app服务,也可以以后在其他项目里直接拿来使用。

再者就是满足一下能自己发一个flutter package的小愿望。

插件介绍

在flutter中,一个插件叫做一个package,使用packages的目的就是为了达到模块化,可以创建出可被复用和共享的代码,这和大多数编程语言中的模块、包的概念相同。创建出来的package可以在pubspec.yaml中直接依赖。

一个最小化的package包含了两部分:

  • 一个pubspec.yaml文件:一个元数据文件,声明了声明了package的名称、版本、作者等信息。

  • 一个lib文件夹:包含里package的公开代码,文件夹至少需要存在<pakcage-name>.dart这个文件。

注意:<pakcage-name>.dart这个文件必须存在,因为这是方便使用的人快速import这个package来使用它,可以把它理解成一种必须要遵守的规则。

package的种类

package可以分为两种:纯dart代码的package和带有特定平台代码的package。

  • Dart packages:这是一个只有dart代码的package,里面包含了flutter的特定功能,所以它依赖于flutter的framework,也决定了它只能用在flutter上。

  • plugin packages:这是一个既包含了dart代码编写的api,又包含了平台(Android/IOS)特定实现的package,可以被Android和ios调用。

上面应该很好理解,可以理解成java jar包和Android sdk的区别。而要开发的定位package就是第二种。

开发plugin pakcage实践

官方推荐的做法使用命令行创建一个package。

首先是创建一个dart package,这里不多做讲述很简单,执行以下命令即可。

$ flutter create –template=package hello

创建plugin package

我们使用如下命令创建一个plugin package,template选择了plugin:

$ flutter create –org com.kinsomy –template=plugin amap_location_plugin

默认情况下,创建的plugin项目是使用objective-c(ios)和java(Android)编写,如果需要增加对swift和kotlin的支持,可以在命令中添加 -i 和 -a。

$ flutter create –org com.kinsomy –template=plugin amap_location_plugin -i swift -a kotlin hello

因为我是用Android studio开发,因此也可以用Android studio直接创建:选择新建FLutter project,然后选择plugin project即可。swift和kotlin的支持在创建界面上勾选即可。

项目结构

创建完成后看到整个plugin项目的结构:

  • lib/amap_location_plugin.dart 这是plugin package中dart api的代码部分,是供使用者在他们自己的flutter项目中调用的接口代码。

  • AmapLocationPlugin.java 这是plugin package中Android部分的具体实现,要和上面的dart api配合进行开发。

  • ios/ 这里是plugin package ios部分的具体实现,和上面Android实现类似,编写ios平台特定代码。

  • example/ 这是用来说明使用plugin package的示例代码,里面源码依赖了写好的plugin。

代码实现

细节会在下一篇文章中详细讲述。

目前我的plugin只针对Android平台开发。对于plugin项目我需要同时编写java代码和dart代码,java代码写在android/src/main/java/com/green/kinsomy/application目录下,主要工作是接入高德定位sdk,同时和dart代码进行交互,dart代码则在lib目录下编写,再次提醒文件夹内至少需要存在<pakcage-name>.dart这个文件。

发布packages

当你写完了自己的plugin项目,并且测试通过后,就可以发布出去供其他人使用,最好在example里面编写示例代码。

在发布之前,检查pubspec.yaml、README.md以及CHANGELOG.md文件,pubspec.yaml内的作者,版本号,名称等信息是必填的,README.md文档则是描述你的plugin的用处和使用方法,CHANGELOG.md记录的版本的迭代信息。

所有的工作都完成之后,运行命令检check是不是都完整。

$ flutter packages pub publish –dry-run

如果所有工作无误的话,就可以执行发布命令了。

$ flutter packages pub publish

然后你就可以在pub库里面搜索自己发布的package名称找到他。

可以在package主页上看到一个分数标志,在哪里会告诉你如何提高你的分数,比如提供更加详细的说明以及完整的使用文档等等。

参考文档

  1. Developing Packages & Plugins

  2. flutter/plugins git仓库

  3. Dart packages