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

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

系列文章:

(一)Flutter插件开发必备 原生SDK->Dart接口生成引擎Fluttify介绍

(二)如何利用Fluttify开发一个新的Flutter插件

(三)Fluttify输出的Flutter插件工程详解

使用Fluttify生成插件

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


快速开始

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

  1. 联系我(382146139@qq.com)生成插件;
  2. ./lib文件夹下新建dart文件夹(这一步是可选的,为了不弄乱文件夹而已);
  3. 创建./dart/janalytics_service.dart文件(名字随你喜欢,只是找个地方放初始化代码);
  4. 去官网集成指南找初始化代码:
    4.1 android: JAnalyticsInterface.init(Context context);;
    4.2 ios: [JANALYTICSService setupWithConfig:config];;
  5. 编写Dart代码:
import 'package:flutter/cupertino.dart';
import 'package:janalytics_fluttify/src/android/android.export.g.dart'; // 这是生成的代码
import 'package:janalytics_fluttify/src/ios/ios.export.g.dart'; // 这是生成的代码

class JAnalyticsService {
  static Future<void> init({@required String iosKey}) async {
    // `platform`方法封装了一些方便多平台调用的逻辑,如果你喜欢也可以直接if else判断平台然后各自调用各平台的代码
    await platform(
      // pool参数是需要释放的原生对象的集合,在platform方法执行结束后会自动释放原生对象,具体可以看本篇下面的说明
      android: (pool) async {
        await cn_jiguang_analytics_android_api_JAnalyticsInterface
            .init(await android_app_Application.get());
      },
      ios: (pool) async {
        final config = await JANALYTICSLaunchConfig.create__();
        await config.set_appKey(iosKey);
        await config.set_channel('developer-default');

        await JANALYTICSService.setupWithConfig(config);
        
        pool.add(config);
      },
    );
  }
}
  1. 插件的一个方法编写完毕。

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

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


Fluttify产物工程结构

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

  • function.g.dart文件:生成的所有顶层函数;
  • type_op.g.dart文件:所有的asis方法,用来判断类型和造型;
  • ios/android.export.g.dart文件:导出所有的ios/android类型;
  • platformview文件夹:生成的所有PlatformView

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

lib文件夹结构概览:

.
├── janalytics_fluttify.dart
└── src
    ├── android
    │   ├── android.export.g.dart
    │   ├── cn ... android端对应的dart接口
    │   └── type_op.g.dart
    ├── dart
    │   └── janalytics_service.dart
    └── ios
        ├── JANALYTICSBrowseEvent.g.dart
        ├── ...其他生成文件
        ├── functions.g.dart
        ├── ios.export.g.dart
        └── type_op.g.dart

基本操作

创建对象

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

class JANALYTICSLaunchConfig extends NSObject  {
  static Future<JANALYTICSLaunchConfig> create__() async {
    // ...调用原生创建对象
  }
}

如果构造器没有参数,那么就直接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,欢迎各位的反馈。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342