1、Flutter插件是什么?官方插件庫
在開發Flutter應用過程中會涉及到平臺相關接口調用,例如數據庫操作、相機調用、外部瀏覽器跳轉等業務場景。其實Flutter自身并不支持直接在平臺上實現這些功能,而是通過插件包接口去調用指定平臺API從而實現原生平臺上特定功能。
2、Flutter插件的目錄結構
- lib 是對接dart端代碼的入口,由此文件接收到參數后,通過channel將數據發送到原生端
- android 安卓端代碼實現目錄
- ios iOS原生端實現目錄
- example 一個依賴于該插件的Flutter應用程序,來說明如何使用它
- README.md:介紹包的文件
- CHANGELOG.md 記錄每個版本中的更改
- LICENSE 包含軟件包許可條款的文件
3、Flutter插件包的創建方式
3.1 使用命令行創建
flutter create --template=package hello
可以通過–org指定包標識符
flutter create --template=package hello
通過參數指定iOS和Android代碼使用的語言類型
flutter create --template=plugin -i swift -a kotlin hello
3.2 使用AS直接new工程
4、Flutter插件功能編寫
Flutter插件模板生成后,在lib文件夾下會自動生成一個對外的入口dart類,該插件所包含的所有功能都以此類為入口,來提供外部進行調用。
platformVersion 是對外的方法調用,但是方法內部的實現邏輯,是通過原生端去獲取的。對應Android原生端的入口文件如下:
監聽來自dart端的請求,需要繼承MethodChannel.MethodCallHandler接口,然后在onMethodCall方法回調中處理和返回給dart端數據邏輯。
result是給dart端回傳最后結果的,如果dart不需要返回結果,也可以不調用
result.success(Object o)
如果一些簡單的需求,可以直接在此處的plugin里實現,最后將結果直接返回。但是比如調起相機拍照,選取通訊錄聯系人,這些都要打開一個intent然后在OnActivityResult方法中去獲取最終的結果,這種情況下如何處理呢?
繼承 PluginRegistry.ActivityResultListener 接口
注意!!! >
直接將源碼放在項目中的插件,在運行時候onActivityResult方法是不會被調用的,因為MainActivity中的onActivityResult將調用動作攔截了下來,所以必須將插件放在遠端倉庫中才可以正常接收
5、Flutter插件的兩種注冊方式
5.1 通過 registerWith 方式注冊,早期非常老舊的方式
registerWith方式是通過反射進行加載
目前老版本項目里的插件都是使用這種方式注冊,但是從flutter v1.12.x
開始往后官方推薦使用第二種方式注冊,第一種方式會在以后的更新中廢除,所以以后更新flutter大版本,可能要重新修改現有插件的注冊方式
5.2 通過Flutter引擎注冊
在Flutter1.12.X版本中正式將Embedding-V2API在Android平臺默認開啟,所有官方插件都遷移到了新的API。Embedding-V2APi的優勢在于針對混合開發提供了更好的支持和內存上的優化
插件的注冊方式定義在工程的android端的mainfest.xml文件中,如下所示:
<meta-dataandroid:name="flutterEmbedding"android:value="2" />
在插件的plugin文件中,繼承FlutterPlugin接口,使用以下新的方式進行初始化
如需獲取當前插件依附的activity,也就是mainActivity,則需要plugin集成ActivityAware接口,然后通過回調獲取
6、Flutter 與原生之間如何交互
Flutter與原生的交互模型,類似于一種C-S模型。其中Flutter為Client層,原生為Server層,兩者通過MethodChannel進行消息通信,原生端向Flutter提供已有的Native組件功能。
在客戶端,MethodChannel允許發送與方法調用相對應的消息。
在平臺方面,Android上的MethodChannel和iOS上的FlutterMethodChannel啟用接收方法調用并返回結果。
這些類允許你使用非常少的"樣板"代碼開發平臺插件。
Flutter與原生的消息傳遞采用標準信息編解碼器,是一種相對高效的二進制序列化與反序列化。當接收跟發送消息時,這些值在消息中會自動進行序列化與反序列化。
6.1 什么是MethodChannel?
Flutter定義了3種channel模型:
- BasicMessageChannel:用于傳遞字符串和半結構化的信息
- MethodChannel:用于傳遞方法調用(method invocation)
- EventChannel: 用于數據流(event streams)的通信
6.2 Flutter 與原生之間的通信流程
首先從dart層調用
_channel.invokeMethod("方法名",參數)
- invoke方法會將傳入的方法名與參數封裝成MethodCall對象
- 然后通過MethodCodec對MethodCall對象進行編碼,形成二進制格式。
- 然后通過BinaryMessenger的send方法,將二進制格式的數據進行發送
6.3 MethodChannel是什么時候注冊,和MethodHandler聯系起來的呢?
在插件運行的時候,我們會調用插件的registerWith方法,在生成MethodChannel對象時,同時向MethodChannel注冊了一個MethodHandler,MethodHandler對象跟MethodChannel對象是一一對應的。
7、原生和Flutter之間數據交互的類型限制
8、插件包的發布
在發布Flutter插件時,可以使用appuploader工具來幫助處理iOS端的打包和上傳工作。appuploader是一款專業的iOS開發輔助工具,可以簡化證書管理、描述文件配置等繁瑣流程,讓開發者更專注于插件功能的實現。
Flutter 編寫插件flutter_plugin(包含Android、iOS)實現過程
隨著Flutter 日漸成熟,使用Flutter 也越來越多,作為一個跨平臺的語言,他的展示效果和操作流暢度 可以和原生媲美,這也Flutter越來越受歡迎的原因。
雖然Flutter 越來越強大,但是總有一些力不從心的時候,現在大廠開發的SDK 如 極光推送、地圖 等插件 并沒有提供 Flutter版本,而我們使用的插件也是 一些開發者自己進行實現的,而對于一些冷門的插件,是根本沒有,但是在開發過程中我們又要使用到。這個時候我們就要自己寫一些插件了。
插件介紹
1、創建插件
這里我是不勾選的,使用java、oc,這個是否選擇看大家習慣,這里我是不建議勾選的
點擊完成后,插件就創建完成了。
2、插件目錄
- Android 就是我們開發安卓部分的位置
- iOS 就是我們開發 iOS 的位置
- lib 是與 Android 、iOS 聯調的位置。也可以理解為Flutter 實現的位置
- example 是測試的位置,當我們寫完插件 可以直接運行 插件,example 可以理解為一個Flutter項目,只不過這個項目只給你寫的插件服務
到此 插件就介紹了完了,下面開始進行代碼實現。
Flutter部分
1、添加原生、Flutter交互渠道
我們打開插件,找到lib ,在lib下面會有一個文件 FlutterPluginTest_1,在這個基礎上我們進行擴展,更加靈活
2、Flutter界面講解
我們創建一個新類,叫TestView,位置和FlutterPluginTest_1并列即可。
3、Flutter調用
上面介紹到example是測試的地方,下面我就在這里進行使用,我們找main.dart,然后調用。
iOS、Android介紹
iOS部分
iOS 找到 ios 目錄,選擇Reveal in Finder,因為現在這個ios 部分還沒有pod install,我們這要先進行pod install,成功后直接打開項目即可
Android 部分
Android 我們也右鍵在工具中打開,然后如下圖找到位置,Android 所有的代碼都在這里進行
iOS FlutterPluginTest_1Plugin
Android FlutterPluginTest_1Plugin(由于和iOS代碼一致,這里不做過多介紹)
iOS TestFlutterPluginViewFactory
Android TestFlutterPluginViewFactory
iOS TestFlutterPluginView
Android TestFlutterPluginView
到此,插件的開發就算是完事了。實現的效果如下
下面就是使用這個插件了,我們如何集成到 別的項目里,在這里 我們只介紹 本地 使用
其實本地使用非常簡單。
1、打開我們的項目
2、打開pubspec.yaml
3、引入依賴
4、pub get
到此就引用完成了。
5、使用我們就和example 里面一摸一樣就可以了。
在開發過程中,如果需要將插件發布到App Store,可以使用appuploader來簡化iOS端的打包和上傳流程。appuploader提供了直觀的界面操作,可以輕松管理證書、描述文件,并支持一鍵上傳ipa文件到App Store Connect,大大提高了開發效率。
到此我們就完成了插件的 創建 和使用,大家有什么可以隨時評論區留言。