Flutter 自定義插件基礎

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,大大提高了開發效率。

到此我們就完成了插件的 創建 和使用,大家有什么可以隨時評論區留言。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77485.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77485.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77485.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

極狐GitLab 外部授權控制機制是怎樣的?

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 外部授權控制 (BASIC SELF) 在高度控制的環境中&#xff0c;訪問策略可能需要由外部服務控制&#xff0c;該服務允許基于項目…

Linux系統之----馮諾依曼結構

1.簡要描述 馮諾依曼體系結構是現代計算機的基本設計思想&#xff0c;其核心理念是將計算機的硬件和軟件統一為一個整體&#xff0c;通過存儲程序的方式實現計算。馮諾依曼體系結構的核心思想是通過存儲程序實現自動計算&#xff0c;其五大部件協同工作&#xff0c;奠定了現代…

【八股】計算機網絡

1 概述 1.1 網絡的網絡 網絡把主機連接起來,而互連網(internet)是把多種不同的網絡連接起來,因此互連網是網絡的網絡。而互聯網(Internet)是全球范圍的互連網。 1.2 ISP 互聯網服務提供商 ISP 可以從互聯網管理機構獲得許多 IP 地址,同時擁有通信線路以及路由器等聯…

基于VS Code 為核心平臺的python語言智能體開發平臺搭建

以下是基于 VS Code 為核心平臺&#xff0c;整合 Node-RED、Gradio、Docker Desktop 的智能體可視化開發平臺優化方案&#xff0c;聚焦工具鏈深度集成與開發效率提升&#xff1a; 一、核心架構設計 #mermaid-svg-f8l9kYPAlJ2TlpGF {font-family:"trebuchet ms",verd…

STM32G0單片機自帶RTC

STM32有個自帶RTC外設&#xff0c;外接32.768KHz的晶振后可得到相對精確的計時功能。 實測了一個一小時快個1秒多。 1 cubeMX設置了RTC后自動生成的初始化代碼如下 static void MX_RTC_Init(void) {/* USER CODE BEGIN RTC_Init 0 *//* USER CODE END RTC_Init 0 */RTC_TimeT…

細說STM32單片機FreeRTOS任務管理API函數及多任務編程的實現方法

目錄 一、FreeRTOS任務管理API函數 1、任務管理API函數 2、獲取任務的句柄 &#xff08;1&#xff09;函數xTaskGetCurrentTaskHandle() &#xff08;2&#xff09;函數xTaskGetIdleTaskHandle() &#xff08;3&#xff09;函數xTaskGetHandle() 3、單個任務的操作 &a…

星露谷物語 7000+ 大型MOD整合包

衣服美化、家具美化、地圖美化、人物肖像美化 全地圖裝修存檔、人物美化、擴展包、環境美化、家具、動植物、通用前置包、新增NPC、功能、服裝發飾妝 帽子發型農場小鎮美化大型玩法拓展實用功能mod 動漫人物形象MOD 地點/動物/地圖/功能/機械/家具/建筑/界面美化/擴展/農場/食譜…

C++ `unique_ptr` 多線程使用

C unique_ptr 多線程使用 一、核心結論 操作同一個 unique_ptr&#xff1a;必須加鎖&#xff08;所有權轉移是非原子操作&#xff09;訪問被管理對象&#xff1a;若對象非線程安全&#xff0c;仍需額外同步獨立 unique_ptr 實例&#xff1a;不同線程操作不同實例時無需加鎖 二…

Android audio系統六 AudioEffect音效加載

對于Android系統智能硬件設備&#xff0c;音效處理的實現方式有以下幾種&#xff1a; AudioEffect – android系統音效處理 優點&#xff1a;純軟件實現&#xff0c;移植調試簡單方便 缺點&#xff1a;cpu上運行&#xff0c;容易因為資源競爭而出現卡頓 DSP/ADSP – 數字信號處…

深度學習總結(21)

超越基于常識的基準 除了不同的評估方法&#xff0c;你還應該了解的是利用基于常識的基準。訓練深度學習模型&#xff0c;你聽不到也看不到。你無法觀察流形學習過程&#xff0c;它發生在數千維空間中&#xff0c;即使投影到三維空間中&#xff0c;你也無法解釋它。唯一的反饋…

接口自動化測試(二)

一、接口測試流程&#xff1a;接口文檔、用例編寫 拿到接口文檔——編寫接口用例以及評審——進行接口測試——工具/自動化框架進行自動化用例覆蓋(70%)——輸出測試報告 自動化的目的一般是為了回歸 第一件事情&#xff1a;理解需求&#xff0c;學會看接口文檔 只需要找到我…

Linux上位機開發實踐(以MCU小系統入門嵌入式電路)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】 一直都主張嵌入式軟件工程師&#xff0c;也要會做一點電路設計的工作。哪怕自己做的是嵌入式linux上層開發&#xff0c;一個會硬件設計&#xff0c…

瀏覽器的存儲機制 - Storage

瀏覽器的存儲機制 - Storage 前言一、核心概念與區別二、常用 API1、存儲數據&#xff08;setItem(key, value)&#xff09;2、 獲取數據&#xff08;getItem(key)&#xff09;3、刪除單個數據&#xff08;removeItem(key)&#xff09;4、清空所有數據&#xff08;clear()&…

考研單詞筆記 2025.04.18

chance n機會&#xff0c;風險&#xff0c;冒險&#xff0c;可能性&#xff0c;巧合&#xff0c;意外a偶然的&#xff0c;意外的 opportunity n機會&#xff0c;時機 crisis n危機&#xff0c;危急關頭 the economic crisis 經濟危機 danger n危險&#xff0c;可能性&#…

第三方API——Spring Boot 集成阿里云短信發送功能

目錄 一. 創建阿里云OSS服務并獲取密鑰&#xff0c;開通短信服務 1.1 注冊阿里云服務器 1.2 開通短信服務 1.3 創建對象存儲OSS服務 1.4 RAM用戶授權短信權限 1.5 新增用戶并授權用戶短信權限 1.6 獲取 AccessKey ID 和 AccessKey Secret 二. 創建項目集成短信發送 2.1…

b站PC網頁版視頻播放頁油猴小插件制作

文章目錄 前言需求分析實施觀察頁面起始渲染編碼效果展示 總結 前言 新手上路,歡迎指導 需求分析 想要一個簡約干凈的界面,需要去除推薦欄和廣告部分. 想要自由調節視頻播放速率,需要在視頻控制欄加一個輸入框控制視頻倍速 實施 觀察頁面起始渲染 因為要使用MutationObse…

暢游Diffusion數字人(27):解讀字節跳動提出主題定制視頻生成技術Phantom

暢游Diffusion數字人(0):專欄文章導航 前言:主題定制視頻生成,特別是zero-shot主題定制視頻生成,一直是當前領域的一個難點,之前的方法效果很差。字節跳動提出了一個技術主題定制視頻生成技術Phantom,效果相比于之前的技術進步非常顯著。這篇博客詳細解讀一下這一工作。 …

ESP8266簡單介紹

ESP8266模塊圖如下 ESP8266的工作模式有三種 ESP8266支持STA、AP、STAAP三種工作模式 ①STA模式 &#xff08;ESP充當設備與路由器相連&#xff09; ②AP模式 &#xff08;ESP充當路由器&#xff09; ③APSTA&#xff08;上述兩種模式兼具&#xff09; AT指令介紹 使用安…

DeepSeek-R3、GPT-4o 與 Claude-3.5-Sonnet 全面對比:性能、應用場景與技術解析

隨著大模型技術的迅猛發展&#xff0c;國產模型正逐漸嶄露頭角&#xff0c;尤其是DeepSeek-R3的發布&#xff0c;更是在AI技術社區中引起廣泛關注。而與此同時&#xff0c;國際領先的GPT-4o和Claude-3.5-Sonnet也在不斷迭代升級&#xff0c;持續刷新業界對AI能力的認知。下文將…

城市街拍暗色電影膠片風格Lr調色教程,手機濾鏡PS+Lightroom預設下載!

調色介紹 城市街拍暗色電影膠片風格 Lr 調色&#xff0c;是借助 Adobe Lightroom 軟件&#xff0c;為城市街拍的人像或場景照片賦予獨特視覺風格的后期處理方式。旨在模擬電影膠片質感&#xff0c;營造出充滿故事感與藝術感的暗色氛圍&#xff0c;讓照片仿佛截取于某部充滿張力…