距离上一篇文章好几年了,不是我不想写,而是我真的懒,今天又到了不得不写的时候了。
这篇文章的名字有点笼统,但是没有办法,因为我也不知道叫什么好,大致描述一下就是:这篇文章是Flutter插件化简单教程,主要是对Android原生(引入jar、aar包)插件编写,然后再集成到Flutter项目中的描述。
一、创建Flutter Plugin项目
首先第一步,打开自己的Flutter项目,依次点击:File→New→New Flutter Project,如下图所示:
第二步,开始创建Flutter Plugin项目,如下图所示:
二、Flutter Plugin项目结构说明
Flutter Plugin项目结构如下图所示:
以上结构中,我们重点关注其中4个文件夹:
1.android(完整的 Android 工程,用来开发 Android 端的插件功能)
2.ios(完整的 IOS工程,用来开发 IOS端的插件功能)
3.example(用来测试 Android 或者 IOS 端的插件功能)
4.lib(负责和 Android 或者 IOS 端的交互)
三、打开android文件夹,进行android插件编写
点击android文件夹下的build.gradle文件,然后再点击Open for Editing Android Studio,这样就可以将android文件夹当成一个android项目打开,示意图如下:
打开后,会有两个android文件夹,一个是编写插件的android工程文件夹,一个是用来测试的android工程文件夹,此处需注意,不要选择错了。
接下来在src的同级目录下创建libs文件夹,所有需要引入的jar、aar包都放进去,然后按正常android项目右键将其依赖到项目中。
此处需要说明的是,在当前这个android工程中,目录可能不完善,可以自行手动创建layout、values等文件夹或文件,最终我的结构如下图所示:
android代码编写
经过上面一顿猛如虎的操作,我们接下来就要真正开始编写插件代码了。首先找到并打开默认生成的以Plugin结尾的文件,然后找到文件中的onMethodCall方法,一般来讲,我们所有的插件代码都需要写到该方法中,在该方法中通过call.method == "xxx"分支判断来对插件做出具体操作,如下图所示:
在这里需要获取Context的,可以在onAttachedToEngine方法中获取,具体代码:
flutterPluginBinding.applicationContext
在这里需要获取Activity的,可以通过实现ActivityAware接口后,在其onAttachedToActivity方法中获取,具体代码:
override fun onAttachedToActivity(binding: ActivityPluginBinding) {
activity = binding.activity
}
flutter代码编写
来到这里,我们已经完成一半工作了,接下来我们需要返回刚才的Flutter Plugin工程中,在其lib文件夹下找到以method_channe结尾的文件。此处请注意,不同版本的Android Studio可能生成文件不一致,如果有出入,请在该目录下寻找含有以下代码的文件:
MethodChannel methodChannel = const MethodChannel
接下来我们添加调用android插件的代码:
static Future<String?> arouseAbc() async {
final arouseAbcResult = await methodChannel.invokeMethod<String>('arouseAbc');
return arouseAbcResult;
}
其中arouseAbc是我们在android插件代码里用于分支判断的字符串,需要与之一致
flutter调用插件测试
写完两端代码后,我们对功能进行简单的测试,看看能不能正常运行。此时我们需要打开位于example→lib路径下的main.dart文件,并在其中添加调用插件方法,代码如下:
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter_yn_abc_plugin/flutter_yn_abc_plugin_method_channel.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String arouseAbcResult = '无数据';
@override
void initState() {
super.initState();
}
Future<void> testPlugin() async {
String? result = '';
result = await MethodChannelFlutterYnAbcPlugin.arouseAbc();
setState(() {
arouseAbcResult = result!;
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
),
body: Center(
child: InkWell(
child: Text('Running on: $arouseAbcResult'),
onTap: (){
testPlugin();
},
),
),
),
);
}
}
至此,整个Flutter插件化就结束了,为了各位高手、低手、新朋友、老朋友易于上手,整篇文章中示例代码都写得特别简单,如果一遍没有成功,就再来一遍,如果还不成功,打钱给我我帮你!!!(妈的,这个人好不要脸啊)
本地插件依赖到Flutter项目中
插件完成以后,要在Flutter项目中使用非常简单,简单到令人发指
第一步:在自己的Flutter项目中,创建Plugins文件夹,再复制整个Flutter插件文件到创建的Plugin文件夹中,如下图所示:
第二步:在自己的Flutter项目中的pubspec.yaml文件里添加插件依赖代码:
# 本地插件
flutter_yn_abc_plugin:
path: plugins/flutter_yn_abc_plugin
第三步:在自己的Flutter项目中,按照前文flutter调用插件测试的描述进行调用
好了,终于完了,写这些破玩意好累人。。。