Android--自己写Flutter插件

使用过Flutter开发的攻城狮都知道,Flutter现有的插件虽然已很丰富,但是某些场景依然无法实现,比如我们自身应用的加解密,特定业务场景的处理,此时需要插件来支撑,攻城狮们可以直接在flutter工程的android工程/ios工程目录下直接新增相应的逻辑,并通过MethodChannel 和 EventChannel来进行交互

复杂的场景,比如这块插件内容不止于本项目工程使用,另外工程也会使用,这个时候我们可以抽离出来,单独写这样的插件,然后供项目去使用,就不需要来回的copy代码了

接下来我会把自己创建插件的步骤罗列出来,以及MethodChannel和EventChannel在插件中的使用分发,大家有任何问题可以评论,一起学习成长,由于本博主是Android攻城狮,所以我主要讲解Android端

进入正题:

1、首先我们要New 一个 Flutter Plugin插件工程

2、该工程默认生成了一个dart入口程序,android工程下已有一个Plugin

3、此时打开该插件的Android工程,会发现找不到io.flutter.plugin.*,也即找不到flutter.jar包,此时需要针对该问题做以下检查以及配置

1)

2)

def localProperties = new Properties()

def localPropertiesFile = rootProject.file(‘local.properties’)

if (localPropertiesFile.exists()) {

localPropertiesFile.withReader(‘UTF-8’) {

reader -> localProperties.load(reader)

}

}

//获取flutter的sdk路径

def flutterRoot = localProperties.getProperty(‘flutter.sdk’)

if (flutterRoot == null) {

throw new GradleException(“Flutter SDK not found. Define location with flutter.sdk in the local.properties file.”)

}

dependencies {

implementation “org.jetbrains.kotlin:kotlin-stdlib-jdk7:k o t l i n v e r s i o n " i m p l e m e n t a t i o n ′ a n d r o i d x . a p p c o m p a t : a p p c o m p a t : 1.3. 0 ′ c o m p i l e O n l y f i l e s ( " kotlin_version" implementation 'androidx.appcompat:appcompat:1.3.0' compileOnly files("kotlin

v

ersion"implementation

androidx.appcompat:appcompat:1.3.0

compileOnlyfiles("flutterRoot/bin/cache/artifacts/engine/android-arm/flutter.jar”)

compileOnly ‘androidx.annotation:annotation:1.1.0’

}

3)此时在同步项目,如果项目可以跑起来,则可以进行接下来的操作

4、此时我们看Android工程下的plugin文件,可以看到只是实现了MethodChannel,如果我们也需要EventChannel这种操作后的通知行为时,我们需要实现EventChannel.StreamHandler,然后进行EventChannel的初始化,这里注意一下,EventChannel的name不要和MethodChannel的名字一样

5、参照我的例子如下

大家注意到以上图片我同样实现了 ActivityResultListener, ActivityAware

ActivityResultListener 监听startActivityForResult返回的结果,如果我们有这种场景,记得实现

ActivityAware 获取当前上下文Activity对象,以方便用到Activity上下文时的操作,这两个用法不多说,大家有要了解的可以私下去看下,相对比较简单

至此,android层的例子结束,大家可以看到我定义了两个方法

getPlatformVersion 和 getString,getString方法,同时用eventSink回调给了flutter层一个通知内容

6、flutter层的实现

class ZhwLoginPlugin{

final MethodChannel _channel ;

final EventChannel _eventChannel ;

static ZhwLogin _instance;

//如果有多个分发结果需要处理,可以定义多个StreamController,然后在客户端进行监听

//StreamController的类型 T 可以是任何类型,对象,map等都可以,接收的时候亦如此接收即可

StreamController _getStringStreamController = StreamController.broadcast();

//客户端监听 initState()方法中 ZhwLogin().getStringResp.listener((event) {})

Stream get getStringResp => _getStringStreamController.stream;

//factory Flutter单例模式,在这里面进行初始化操作

factory ZhwLogin(){

if (_instance == null) {

final MethodChannel methodChannel = const MethodChannel(“zhw_login”);

final EventChannel eventChannel = const EventChannel(‘zhw_login_event’);

//初始化操作

_instance = ZhwLogin._private(methodChannel, eventChannel);

}

return _instance;

}

ZhwLogin._private(this._channel,this._eventChannel){

//初始化监听

_eventChannel.receiveBroadcastStream().listen(_onEvent, onError: _onError);

}

Future get platformVersion async {

final String version = await _channel.invokeMethod(‘getPlatformVersion’);

return version;

}

void getString(){

_channel.invokeMethod(“getString”);

}

void parseGetStringNotification(String eventString){

_getStringStreamController.add(eventString);

}

void _onEvent(Object event) {

print(“监听到Android端EventChannel返回==$event”);

if (event != null) {

String eventString = event;

try {

//在这里做一些监听到参数的处理,可能会同步通知很多

// final imMap = json.decode(eventString);

parseGetStringNotification(eventString);

//监听到数据之后做各种解析

} on FormatException catch (e) {

print(e.message);

} on NoSuchMethodError catch (e) {

print(e.toString());

}

}

}

//错误监听这个不用管

void _onError(Object error) {

print(“ZhwLogin - ${error.toString()}”);

}

}

7、接下来看下调用

initState里 做一个EventChannel的监听操作,我有一个监听打印

initPlatfromState里做了监听的调用 也即 getString()方法

8、看下打印日志哦

具体例子可参考:https://github.com/jianibaobei/test_flutter_plugin

————————————————

版权声明:本文为CSDN博主「墨客Mary」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/zhangjunlei88/article/details/118758603

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

推荐阅读更多精彩内容