從頭開發一個Flutter插件(二)高德地圖定位插件

開發基于高德定位SDK的Flutter插件

在上一篇文章里具體介紹了Flutter插件的具體開發流程,從創建項目到發布。接下來將為Flutter天氣項目開發一個基于高德定位SDK的Flutter定位插件。

申請key

首先進入高德地圖定位SDK文檔內下載定位SDK,并按要求申請App Key。這里推薦使用AppUploader來管理你的應用密鑰,它可以安全地存儲和同步你的API密鑰,避免在代碼中直接暴露敏感信息。

配置環境

SDK文檔里有關于配置工程的demo,但因為Flutter插件項目不是一個Android工程,所以會有所區別。大致分以下幾步:

1.集成遠程依賴

compile 'com.amap.api:location:latest.integration'

2.配置App Key

在AndroidManifest.xml的application標簽中配置Key:

<meta-data android:name="com.amap.api.v2.apikey" android:value="您的Key">
</meta-data>

3.聲明service

在application標簽中聲明service組件:

<service android:name="com.amap.api.location.APSService"></service>

4.聲明權限

Flutter插件的目的就是隔離對SDK native code的實現,讓使用者直接使用Dart代碼就可以獲得到SDK提供的定位信息。插件的android文件夾下面是一個完整的Android工程結構,我們在這個工程下完成上述的四步。

唯一一點不同的是,配置App Key利用gradle里的manifestPlaceholders屬性為用戶預留,讓用戶自己來填寫。于是配置App Key改寫成:

<meta-dataandroid:name="com.amap.api.v2.apikey"android:value="${LOCATION_APP_KEY}"/>

這個LOCATION_APP_KEY,使用者使用插件的時候在自己Flutter項目的Android工程下的app/build.gradle文件里填寫自己申請的高德key即可。

android {compileSdkVersion 27lintOptions {...}defaultConfig {...manifestPlaceholders = [LOCATION_APP_KEY : "你的高德地圖key",]}
}

對于iOS開發者,可以使用AppUploader來簡化證書管理和配置過程,它提供了可視化的界面來管理開發證書和描述文件。

實現

Flutter插件最終暴露給插件使用者的是Dart代碼的接口,使用者不再需要關心Android和iOS平臺上的代碼。在定位插件項目中,唯一需要配置的就是上文所說的高德開放平臺的App Key。

因為現在是將特定平臺的SDK開發成插件供Flutter App使用,其實就可以理解在Android或者iOS平臺正常開發項目,將Flutter App需要的數據傳遞過去,Flutter插件只是在特定平臺的實現上做了一次封裝與隔離,封裝了Dart接口,隔離了兩個不同平臺實現的差異。

Java部分

Java部分的代碼寫在了AmapLocationPlugin.java類下面,它分別實現了MethodChannel.MethodCallHandler, EventChannel.StreamHandler。并且在registerWith方法調用的實例化MethodChannel和EventChannel。

final MethodChannel methodChannel = new MethodChannel(registrar.messenger(), "plugin.kinsomy.com/methodchannel");final EventChannel eventChannel = new EventChannel(registrar.messenger(), "plugin.kinsomy.com/eventchannel");
  • 重寫MethodChannel.MethodCallHandler的onMethodCall方法接受Dart代碼的方法調用
@Override
public void onMethodCall(MethodCall call, Result result) {if (call.method.equals("startLocation")) {//啟動定位mLocationClient.startLocation();} else if (call.method.equals("stopLocation")) {//停止定位mLocationClient.stopLocation();} else if (call.method.equals("getLocation")) {result.success(mLocation);} else {result.notImplemented();}
}
  • 重寫EventChannel.StreamHandler的onListen,該方法攜帶了一個EventChannel.EventSink實例,通過該實例對象可以調用mEventSink.success()向Dart傳遞數據流,也就是插件里的定位信息
@Override
public void onListen(Object o, EventChannel.EventSink eventSink) {this.mEventSink = eventSink;
}
  • 通過高德SDK的AMapLocationClient獲取到定位信息,并將其封裝成json字符串供Dart調用。

Dart部分

Dart部分的代碼在項目根目錄lib文件夾下的amap_location_plugin.dart文件。

  • 在構造函數里實例化和Java代碼中同樣channel name的MethodChannel與EventChannel
factory AmapLocation() {if (_instance == null) {final MethodChannel methodChannel =const MethodChannel('plugin.kinsomy.com/methodchannel');final EventChannel eventChannel =const EventChannel('plugin.kinsomy.com/eventchannel');_instance = AmapLocation.private(methodChannel, eventChannel);}return _instance;}
  • 提供接口方法開始定位startLocation和對應的停止定位
Future<void> get startLocation =>_methodChannel.invokeMethod("startLocation");
  • 實例化Stream接受event返回的定位數據
Stream<String> _onLocationFetched;
_onLocationFetched =_eventChannel.receiveBroadcastStream().map((dynamic event) => event);

這樣一個基于高德定位SDK的Flutter定位插件就算完成了,在example里寫一個demo實際測試一下。

目前這個插件還是個簡易版本,未來希望能加上地圖,導航,線路規劃等一系列的功能。對于需要發布到App Store的開發者,可以考慮使用AppUploader來簡化上傳和發布流程,它支持一鍵上傳IPA文件到App Store Connect。

參考文檔

  1. Developing Packages & Plugins
  2. Flutter/plugins git倉庫
  3. Dart packages
  4. 深入理解Flutter Platform Channel

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

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

相關文章

分布式鎖之redis6

一、分布式鎖介紹 之前我們都是使用本地鎖&#xff08;synchronize、lock等&#xff09;來避免共享資源并發操作導致數據問題&#xff0c;這種是鎖在當前進程內。 那么在集群部署下&#xff0c;對于多個節點&#xff0c;我們要使用分布式鎖來避免共享資源并發操作導致數據問題…

ubuntu中使用安卓模擬器

本文這里介紹 使用 android studio Emulator &#xff0c; 當然也有 Anbox (Lightweight)&#xff0c; Waydroid (Best for Full Android Experience), 首先確保自己安裝了 android studio &#xff1b; sudo apt update sudo apt install openjdk-11-jdk sudo snap install…

二語習得理論(Second Language Acquisition, SLA)如何學習英語

二語習得理論&#xff08;Second Language Acquisition, SLA&#xff09;是研究學習者如何在成人或青少年階段學習第二語言&#xff08;L2&#xff09;的理論框架。該理論主要關注語言習得過程中的認知、社會和文化因素&#xff0c;解釋了學習者如何從初學者逐漸變得流利并能夠…

WinDbg. From A to Z! 筆記(下)

原文鏈接: WinDbg. From A to Z! 文章目錄 使用WinDbg臨界區相關命令示例 -- 查看臨界區其他有用的命令 WinDbg中的偽寄存器自動偽寄存器 WinDbg中的表達式其他操作默認的表達式計算方式 WinDbg中的重命名調試器命令語言編程控制流命令程序執行 WinDbg 遠程調試事件監控WinDbg …

RainbowDash 的旅行

D RainbowDash 的旅行 - 第七屆校賽正式賽 —— 補題 題目大意&#xff1a; 湖中心有一座島&#xff0c;湖的外圍有 m m m 間木屋&#xff08;圍繞小島&#xff09; &#xff0c;第 i i i 間木屋和小島之間有 a i a_i ai? 座 A A A 類橋&#xff0c; b i b_i bi? 座 B …

MySQL-SQL-DDL語句、表結構創建語句

一.SQL SQL&#xff1a;一門操作關系型數據庫的編程語言&#xff0c;定義操作所有關系型數據庫的統一標準 二. DDL-數據庫 1. 查詢所有數據庫 命令&#xff1a;show databases; 2. 查詢當前數據庫 命令&#xff1a;select database(); 3. 創建數據庫 命令&#xff1a;create da…

Sora結構猜測

方案&#xff1a;VAE Encoder&#xff08;視頻壓縮&#xff09; -> Transform Diffusion &#xff08;從視頻數據中學習分布&#xff0c;并根據條件生成新視頻&#xff09; -> VAE Decoder &#xff08;視頻解壓縮&#xff09; 從博客出發&#xff0c;經過學術Survey&am…

TortoiseSVN設置忽略清單

1.TortoiseSVN > Properties&#xff08;如果安裝了 TortoiseSVN&#xff09;。 2. 在彈出的屬性窗口中&#xff0c;點擊 New > Other。 4. 在 Property name 中輸入 svn:ignore 。 5. 在 Property value 中輸入要忽略的文件夾或文件名稱&#xff0c;例如&#xff1a; #…

深入解析Java哈希表:從理論到實踐

哈希表&#xff08;Hash Table&#xff09;是計算機科學中最重要的數據結構之一&#xff0c;也是Java集合框架的核心組件。本文將以HashMap為切入點&#xff0c;深入剖析Java哈希表的實現原理、使用技巧和底層機制。 一、哈希表基礎原理 1. 核心概念 鍵值對存儲&#xff1a;通…

leetcode:1582. 二進制矩陣中的特殊位置(python3解法)

難度&#xff1a;簡單 給定一個 m x n 的二進制矩陣 mat&#xff0c;返回矩陣 mat 中特殊位置的數量。 如果位置 (i, j) 滿足 mat[i][j] 1 并且行 i 與列 j 中的所有其他元素都是 0&#xff08;行和列的下標從 0 開始計數&#xff09;&#xff0c;那么它被稱為 特殊 位置。 示…

《數字圖像處理》教材尋找合作者

Rafael Gonzalez和Richard Woods所著的《數字圖像處理》關于濾波器的部分幾乎全錯&#xff0c;完全從零開始寫&#xff0c;困難重重。關于他的問題已經描述在《數字圖像處理&#xff08;面向新工科的電工電子信息基礎課程系列教材&#xff09;》。 現尋找能夠共同討論、切磋、…

為 Jenkins Agent 添加污點(Taint)容忍度(Toleration)

在 Kubernetes&#xff08;k8s&#xff09;環境中使用 Jenkins 時&#xff0c;為 Jenkins Agent 添加污點&#xff08;Taint&#xff09;容忍度&#xff08;Toleration&#xff09;是一種常見的配置操作&#xff0c;它允許 Jenkins Agent Pod 被調度到帶有特定污點的節點上。下…

LeetCode算法題(Go語言實現)_28

題目 Dota2 的世界里有兩個陣營&#xff1a;Radiant&#xff08;天輝&#xff09;和 Dire&#xff08;夜魘&#xff09; Dota2 參議院由來自兩派的參議員組成。現在參議院希望對一個 Dota2 游戲里的改變作出決定。他們以一個基于輪為過程的投票進行。在每一輪中&#xff0c;每一…

使用python實現視頻播放器(支持拖動播放位置跳轉)

使用python實現視頻播放器&#xff08;支持拖動播放位置跳轉&#xff09; Python實現視頻播放器&#xff0c;在我早期的博文中介紹或作為資料記錄過 Python實現視頻播放器 https://blog.csdn.net/cnds123/article/details/145926189 Python實現本地視頻/音頻播放器https://bl…

用Python和Pygame創造粉色粒子愛心:3D渲染的藝術

引言 在計算機圖形學中&#xff0c;3D效果的2D渲染是一個迷人的領域。今天&#xff0c;我將分享一個使用Python和Pygame庫創建的粉色粒子愛心效果。這個項目不僅視覺效果驚艷&#xff0c;而且代碼簡潔易懂&#xff0c;非常適合圖形編程初學者學習3D渲染的基礎概念。 項目概述…

在匯編層面理解MESI

理解MESI協議在匯編層面的表現需要結合緩存一致性機制和處理器指令執行的行為。以下是分步驟的解釋&#xff1a; 1. MESI協議基礎 MESI是緩存行&#xff08;Cache Line&#xff09;狀態的協議&#xff0c;定義四種狀態&#xff1a; Modified&#xff08;修改&#xff09;&…

愛瑞編程2025暑期CSP集訓營開始招生啦!

一、什么是暑期CSP集訓營&#xff1f; 為全力備戰2025年9月CSP-J/S認證&#xff0c;舉辦的線下編程集訓活動。 旨在通過高強度編程訓練&#xff0c;幫助學員提升競賽能力&#xff0c;沖刺一等獎。 二、為什么參加集訓營&#xff1f; 高效編程特訓&#xff1a;封閉式學習&…

問題大集10-git使用commit提交中文顯示亂碼

&#xff08;1&#xff09;問題 &#xff08;2&#xff09;解決步驟 1&#xff09; 設置全局編碼為 UTF-8 git config --global core.quotepath false git config --global i18n.commitEncoding utf-8 git config --global i18n.logOutputEncoding utf-8 2&#xff09; 顯示或設…

當AI開始“思考“:大語言模型的文字認知三部曲

引言&#xff1a;從《黑客帝國》說起 1999年上映的科幻經典《黑客帝國》描繪了一個令人震撼的未來圖景——人類生活在一個由人工智能構造的數字矩陣中。當我們觀察現代大型語言模型的工作原理時&#xff0c;竟發現與這個虛構世界有著驚人的相似&#xff1a;人們正在用矩陣以及矩…

Golang改進后的任務調度系統分析

以下是整合了所有改進點的完整代碼實現: package mainimport ("bytes""context""fmt""io""log""net/http""sync""time""github.com/go-redis/redis/v8""github.com/robfig/…