注:目前Fluttify自己并不对外开放,可是内测阶段能够免费为你生成插件,只要提供android端的jar/aar和ios端的framework/.h+.a,或者maven坐标和cocoapods名称便可。android
系列文章:ios
(一)Flutter插件开发必备 原生SDK->Dart接口生成引擎Fluttify
介绍git
(二)如何利用Fluttify开发一个新的Flutter插件github
从原生SDK生成Fluttify
产物,本质上也是一个构建的过程,因此Fluttify
采用了Gradle
插件的形式。和android
构建相似,构建Fluttify
也须要提供一个build.gradle
,输入必须的参数后运行gradle fluttify
,便可以生成出一个原生SDK对应的Flutter插件。 这篇文章会以极光统计SDK做为示例。api
以JAnalytics SDK的初始化方法为例:xcode
./lib
文件夹下新建dart
文件夹(这一步是可选的,为了避免弄乱文件夹而已);./dart/janalytics_service.dart
文件(名字随你喜欢,只是找个地方放初始化代码);JAnalyticsInterface.init(Context context);
; 4.2 ios: [JANALYTICSService setupWithConfig:config];
;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);
},
);
}
}
复制代码
能够看到在Fluttify
的加持下,编写插件变成了一件很是轻松的事情,想要写方法的时候就是查官方文档,而后写对应的dart
代码,彻底屏蔽了原生接口。你不用再一次次的打开android studio
和xcode
,一次次地在原生和dart
之间跳来跳去,不再用为了在dart
和原生之间传对象写那一大坨的字段,跟原生有关的,Fluttify
都(尽力)为你提供好dart
接口,这就是Fluttify
的目标。bash
接下来大体介绍下生成的插件的结构以及怎么调用生成的接口。app
Fluttify
的产物是一个标准的Flutter的插件工程,因此lib
文件夹之上的结构都和普通插件同样。lib
文件夹下会分红android
和ios
文件夹,分别放置各平台SDK中的类(枚举/接口等)对应的Dart类(枚举/接口等)。android
/ios
文件夹下还会各自生成:异步
function.g.dart
文件:生成的全部顶层函数;type_op.g.dart
文件:全部的as和is方法,用来判断类型和造型;ios/android.export.g.dart
文件:导出全部的ios/android类型;platformview
文件夹:生成的全部PlatformView
;习惯上会在lib
文件夹下再加一个dart
文件夹,放置对各平台进行抽象的代码,而且最后对外export
的时候,只export
这个文件夹下的文件。async
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,欢迎各位的反馈。