Flutter插件化教程(Android)

距离上一篇文章好几年了,不是我不想写,而是我真的懒,今天又到了不得不写的时候了。
这篇文章的名字有点笼统,但是没有办法,因为我也不知道叫什么好,大致描述一下就是:这篇文章是Flutter插件化简单教程,主要是对Android原生(引入jar、aar包)插件编写,然后再集成到Flutter项目中的描述。

一、创建Flutter Plugin项目

首先第一步,打开自己的Flutter项目,依次点击:FileNewNew 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等文件夹或文件,最终我的结构如下图所示:
5.png

android代码编写

经过上面一顿猛如虎的操作,我们接下来就要真正开始编写插件代码了。首先找到并打开默认生成的以Plugin结尾的文件,然后找到文件中的onMethodCall方法,一般来讲,我们所有的插件代码都需要写到该方法中,在该方法中通过call.method == "xxx"分支判断来对插件做出具体操作,如下图所示:

6.png

在这里需要获取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调用插件测试

写完两端代码后,我们对功能进行简单的测试,看看能不能正常运行。此时我们需要打开位于examplelib路径下的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调用插件测试的描述进行调用

好了,终于完了,写这些破玩意好累人。。。

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

推荐阅读更多精彩内容