在线工具 在线编程 在线白板 在线工具 在线编程 在线白板

如何使用Fluttify开发一个新的Flutter插件

在线求帮请分析下,如何使用Fluttify开发一个新的Flutter插件
最新回答
爱你让我明白

2024-09-05 07:36:53

注:目前Fluttify本身并不对外开放,但是内测阶段可以免费为你生成插件,只要提供android端的jar/aar和ios端的framework/.h+.a,或者maven坐标和cocoapods名称即可

系列文章:

使用Fluttify生成插件

从原生SDK生成Fluttify产物,本质上也是一个构建的过程,所以Fluttify采用了Gradle插件的形式。和android构建类似,构建Fluttify也需要提供一个build.gradle,输入必须的参数后运行gradle fluttify,便能够生成出一个原生SDK对应的Flutter插件。 这篇文章会以 极光统计SDK作为示例。

快速开始

以JAnalytics SDK的初始化方法为例:

可以看到在Fluttify的加持下,编写插件变成了一件非常轻松的事情,想要写方法的时候就是查官方文档,然后写对应的dart代码,完全屏蔽了原生接口。你不用再一次次的打开android studio和xcode,一次次地在原生和dart之间跳来跳去,再也不用为了在dart和原生之间传对象写那一大坨的字段,跟原生有关的,Fluttify都(尽力)为你提供好dart接口,这就是Fluttify的目标。

接下来大致介绍下生成的插件的结构以及怎么调用生成的接口。

Fluttify产物工程结构

Fluttify的产物是一个标准的Flutter的插件工程,所以lib文件夹之上的结构都和普通插件一样。lib文件夹下会分成android和ios文件夹,分别放置各平台SDK中的类(枚举/接口等)对应的Dart类(枚举/接口等)。android/ios文件夹下还会各自生成:

习惯上会在lib文件夹下再加一个dart文件夹,放置对各平台进行抽象的代码,并且最后对外export的时候,只export这个文件夹下的文件。

lib文件夹结构概览:

基本操作创建对象

Fluttify中创建对象主要是使用create方法。这个方法在dart端以静态的异步方法XX.create__xx的形式提供,其中xx是构造器的参数。形如:

如果构造器没有参数,那么就直接XX.create__,后面跟两个下划线是为了不与SDK中的create方法冲突。

调用方法

Fluttify中的所有方法都是异步的,所以你想要看起来像同步代码的话,就要对每个调用都加await。其他的就没什么好说的,因为Fluttify的目的就是为了让原生调用起来跟dart调用起来一模一样,原生怎么调用,dart这边就怎么调用。

支持哪些操作

Fluttify会生成SDK中的公开类,公开方法,以及常量。

基础设施

所有Fluttify生成的工程都会依赖一个基础设施插件,也就是foundation_fluttify。

这个插件提供了系统类的dart接口,并且是手写的。曾经我也尝试过直接对android.jar和ios的系统framework进行生成,虽然理论上能够实现,但是效果并不好,生成出来的文件非常多,光这一个插件编译进app的话就要增大好几Mb,所以放弃了,还是碰到需要的再去手动编写一下就ok了。

另外foundation_fluttify还提供了一些便利方法,比如platform方法简化多平台的调用,kNativeObjectPool存放原生对象的dart引用,等等。

原生对象的生命周期

Fluttiy生成的dart代码在调用过程中产生的原生对象,都会被放入一个叫HEAP的全局键值对类型中,android端为HashMap,ios端为NSDictionary。由于存放在全局变量中,如果不手动释放的话,那么这些对象会一直被强引用,无法释放。foundation_fluttify中的Ref类(dart)有一个release方法,调用它会把对应的原生对象充HEAP中删除,从而解除强引用。

结语

以上就是使用Fluttify开发一个插件的介绍。 janalytics_fluttify已经上传到 fluttify-project组织下,如果有老铁对这个插件感兴趣的话可以联系我(382146139@qq.com),我可以把你设置为维护者,当然有空闲时间时,我也会进一步开发这个插件。

如果有想要生成插件的老铁也可以联系我,目前Fluttify还处于内测阶段,不会收取任何费用,有任何反馈都可以往 fluttify-feedback提issue,欢迎各位的反馈。