IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android--自己写Flutter插件 -> 正文阅读

[移动开发]Android--自己写Flutter插件

使用过Flutter开发的攻城狮都知道,Flutter现有的插件虽然已很丰富,但是某些场景依然无法实现,比如我们自身应用的加解密,特定业务场景的处理,此时需要插件来支撑,攻城狮们可以直接在flutter工程的android工程/ios工程目录下直接新增相应的逻辑,并通过MethodChannel 和 EventChannel来进行交互
复杂的场景,比如这块插件内容不止于本项目工程使用,另外工程也会使用,这个时候我们可以抽离出来,单独写这样的插件,然后供项目去使用,就不需要来回的copy代码了
接下来我会把自己创建插件的步骤罗列出来,以及MethodChannel和EventChannel在插件中的使用分发,大家有任何问题可以评论,一起学习成长,由于本博主是Android攻城狮,所以我主要讲解Android端
进入正题:
1、首先我们要New 一个 Flutter Plugin插件工程
创建FlutterPlugin
2、该工程默认生成了一个dart入口程序,android工程下已有一个Plugin
3、此时打开该插件的Android工程,会发现找不到io.flutter.plugin.*,也即找不到flutter.jar包,此时需要针对该问题做以下检查以及配置
1)检查local.properties是否已经添加了flutter sdk的位置路径
2)
在build.gradle里增加flutter.jar的配置
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(" kotlinv?ersion"implementationandroidx.appcompat:appcompat:1.3.0compileOnlyfiles("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、参照我的例子如下
实现了MethodChannel和EventChannel
大家注意到以上图片我同样实现了 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、接下来看下调用

在我们需要的工程里引入刚才的plugin项目,然后实现调用
initState里 做一个EventChannel的监听操作,我有一个监听打印
initPlatfromState里做了监听的调用 也即 getString()方法
8、看下打印日志哦
打印日志
具体例子可参考:https://github.com/jianibaobei/test_flutter_plugin

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-07-16 11:25:31  更:2021-07-16 11:26:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/5 12:40:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码