版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第使用Flutter定位包獲取地理位置Flutter中獲取地理位置
如今,發(fā)現(xiàn)用戶位置是移動(dòng)應(yīng)用程序非常常見且功能強(qiáng)大的用例。如果您曾經(jīng)嘗試過在Android中實(shí)現(xiàn)位置,您就會(huì)知道樣例代碼會(huì)變得多么復(fù)雜和混亂。
但這與Flutter不同它有很多令人驚嘆的包,可以為您抽象出樣板代碼,并使實(shí)現(xiàn)地理定位成為夢想。另一個(gè)好的方面是您可以在Android和iOS上獲得這些功能。
讓我們快速瀏覽一下我們今天正在構(gòu)建的用于收集位置數(shù)據(jù)的內(nèi)容:
本文將帶您了解兩個(gè)最流行且易于使用的Flutter地理定位包。
讓我們從location開始,這是Flutter最喜歡的包。這很簡單。只需三個(gè)簡單的步驟,您就可以獲取當(dāng)前用戶位置以及處理位置權(quán)限。
在繼續(xù)前進(jìn)之前,讓我們快速檢查一下我們需要的東西:
該FlutterSDK
編輯器:您可以使用VisualCode或AndroidStudio
至少對(duì)Flutter有初級(jí)的了解
差不多就是這樣!
使用Flutter定位包
將依賴項(xiàng)添加到您的文件中:pubspec.yaml
location:^4.3.0
由于Android和iOS處理權(quán)限的方式不同,因此我們必須在每個(gè)平臺(tái)上分別添加它們。
安卓版
將以下位置權(quán)限添加到:AndroidManifest.xml
uses-permissionandroid:name=android.permission.ACCESS_COARSE_LOCATION/
uses-permissionandroid:name=android.permission.ACCESS_FINE_LOCATION/
如果您還想在后臺(tái)訪問用戶的位置,請(qǐng)?jiān)谠L問后臺(tái)位置之前使用該API,并在清單文件中添加后臺(tái)權(quán)限:enableBackgroundMode({boolenable})
uses-permissionandroid:name=android.permission.ACCESS_BACKGROUND_LOCATION/
對(duì)于iOS
將以下位置權(quán)限添加到:Info.plist
keyNSLocationWhenInUseUsageDescription/key
string此應(yīng)用需要訪問您的位置/string
NSLocationWhenInUseUsageDescription是您需要的唯一許可。這也允許您訪問后臺(tái)位置,唯一需要注意的是,當(dāng)應(yīng)用程序在后臺(tái)訪問位置時(shí),狀態(tài)欄中會(huì)顯示藍(lán)色徽章。與Android不同,我們?cè)谄渲刑砑恿藛为?dú)的權(quán)限以在后臺(tái)訪問用戶的位置。
我們需要在請(qǐng)求用戶位置之前檢查位置服務(wù)狀態(tài)和權(quán)限狀態(tài),這可以使用以下幾行代碼輕松完成:
Locationlocation=newLocation();
bool_serviceEnabled;
PermissionStatus_permissionGranted;
_serviceEnabled=awaitlocation.serviceEnabled();
if(!_serviceEnabled){
_serviceEnabled=awaitlocation.requestService();
if(!_serviceEnabled){
returnnull;
_permissionGranted=awaitlocation.hasPermission();
if(_permissionGranted==PermissionStatus.denied){
_permissionGranted=awaitlocation.requestPermission();
if(_permissionGranted!=PermissionStatus.granted){
returnnull;
}
首先,我們創(chuàng)建一個(gè)由Location()包提供的對(duì)象,location反過來為我們提供了兩個(gè)有用的方法。檢查設(shè)備位置是否已啟用或用戶是否已手動(dòng)禁用它。``serviceEnabled()
對(duì)于后者,我們顯示了一個(gè)原生提示,允許用戶通過調(diào)用快速啟用位置,然后我們?cè)贆z查一次,如果他們從提示中啟用了它。requestService()
一旦我們確定啟用了位置服務(wù),下一步就是通過調(diào)用它來檢查我們的應(yīng)用程序是否具有使用它的必要權(quán)限,這將返回.hasPermission()``PermissionStatus
PermissionStatus是可以具有以下三個(gè)值之一的枚舉:
PermissionStatus.granted:定位服務(wù)權(quán)限已被授予
PermissionStatus.denied:定位服務(wù)權(quán)限被拒絕
PermissionStatus.deniedForever:位置服務(wù)權(quán)限被用戶永久拒絕。這僅適用于iOS。在這種情況下不會(huì)顯示對(duì)話框requestPermission()
如果狀態(tài)為,我們可以通過調(diào)用顯示請(qǐng)求位置權(quán)限的系統(tǒng)提示。對(duì)于status,我們可以立即訪問location,因此我們返回一個(gè).denied,``requestPermission()``granted``null
如果您還想在后臺(tái)訪問用戶位置,請(qǐng)使用。location.enableBackgroundMode(enable:**true**)
獲取當(dāng)前位置
如果位置服務(wù)可用并且用戶已授予位置權(quán)限,那么我們只需兩行代碼即可獲取用戶位置-不,我不是在開玩笑:
LocationData_locationData;
_locationData=awaitlocation.getLocation();
LocationData類提供以下位置信息:
classLocationData{
finaldoublelatitude;//Latitude,indegrees
finaldoublelongitude;//Longitude,indegrees
finaldoubleaccuracy;//Estimatedhorizontalaccuracyofthislocation,radial,inmeters
finaldoublealtitude;//InmetersabovetheWGS84referenceellipsoid
finaldoublespeed;//Inmeters/second
finaldoublespeedAccuracy;//Inmeters/second,always0oniOS
finaldoubleheading;//Headingisthehorizontaldirectionoftravelofthisdevice,indegrees
finaldoubletime;//timestampoftheLocationData
finalboolisMock;//Isthelocationcurrentlymocked
}
您還可以通過添加onLocationChanged偵聽器在用戶位置發(fā)生變化時(shí)監(jiān)聽位置更新來獲得連續(xù)回調(diào),這是出租車應(yīng)用程序、司機(jī)/騎手應(yīng)用程序等的一個(gè)很好的用例:
location.onLocationChanged.listen((LocationDatacurrentLocation){
//currentuserlocation
});
注意,一旦您想停止收聽更新,請(qǐng)不要忘記取消流訂閱。
瞧!現(xiàn)在我們有了用戶位置的當(dāng)前緯度和經(jīng)度值。
讓我們利用這些緯度和經(jīng)度值來獲取用戶的完整地址或反向地理編碼。
為此,我們將使用另一個(gè)驚人的Flutter包:geocode。
使用Flutter地理編碼包
將依賴項(xiàng)添加到您的文件中:pubspec.yaml
dependencies:
geocode:1.0.1
獲取地址再簡單不過了。就打電話吧。就是這樣!帶有空檢查的完整函數(shù)如下所示:reverseGeocoding(latitude:lat,longitude:lang)
FutureString_getAddress(doublelat,doublelang)async{
if(lat==null||lang==null)return
GeoCodegeoCode=GeoCode();
Addressaddress=
awaitgeoCode.reverseGeocoding(latitude:lat,longitude:lang);
return${address.streetAddress},${address.city},${address.countryName},${address.postal}
沒那么簡單!
完整的代碼如下所示:
classGetUserLocationextendsStatefulWidget{
GetUserLocation({Keykey,requiredthis.title}):super(key:key);
finalStringtitle;
@override
_GetUserLocationStatecreateState()=_GetUserLocationState();
class_GetUserLocationStateextendsStateGetUserLocation{
LocationDatacurrentLocation;
Stringaddress=
@override
Widgetbuild(BuildContextcontext){
returnScaffold(
appBar:AppBar(),
body:Center(
child:Padding(
padding:EdgeInsets.all(16.0),
child:Column(
mainAxisAlignment:MainAxisAlignment.center,
children:Widget[
if(currentLocation!=null)
Text(
Location:${currentLocation.latitude},${currentLocation.longitude}),
if(currentLocation!=null)Text(Address:$address),
MaterialButton(
onPressed:(){
_getLocation().then((value){
LocationDatalocation=value;
_getAddress(location.latitude,location.longitude)
.then((value){
setState((){
currentLocation=location;
address=value;
color:Colors.purple,
child:Text(
GetLocation,
style:TextStyle(color:Colors.white),
FutureLocationData_getLocation()async{
Locationlocation=newLocation();
LocationData_locationData;
bool_serviceEnabled;
PermissionStatus_permissionGranted;
_serviceEnabled=awaitlocation.serviceEnabled();
if(!_serviceEnabled){
_serviceEnabled=awaitlocation.requestService()
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026屆陜西省西安市西工大附中高三語文第一學(xué)期期末檢測模擬試題含解析
- 內(nèi)勤技能培訓(xùn)
- 小學(xué)的活動(dòng)策劃方案(3篇)
- 烘焙食品安全管理制度(3篇)
- 班級(jí)管理制度的理念是(3篇)
- 美術(shù)活動(dòng)海報(bào)策劃方案(3篇)
- 藥企行業(yè)輿情管理制度(3篇)
- 食品溯源管理制度流程表(3篇)
- 中學(xué)學(xué)生社團(tuán)活動(dòng)表彰獎(jiǎng)勵(lì)制度
- 兼培訓(xùn)課件教學(xué)課件
- 特種工安全崗前培訓(xùn)課件
- 新疆維吾爾自治區(qū)普通高中2026屆高二上數(shù)學(xué)期末監(jiān)測試題含解析
- 2026屆福建省三明市第一中學(xué)高三上學(xué)期12月月考?xì)v史試題(含答案)
- 2026年遼寧金融職業(yè)學(xué)院單招職業(yè)技能測試題庫附答案解析
- (正式版)DB51∕T 3342-2025 《爐灶用合成液體燃料經(jīng)營管理規(guī)范》
- 2026北京海淀初三上學(xué)期期末語文試卷和答案
- 2024-2025學(xué)年北京市東城區(qū)五年級(jí)(上)期末語文試題(含答案)
- 人工智能在醫(yī)療領(lǐng)域的應(yīng)用
- 2025學(xué)年度人教PEP五年級(jí)英語上冊(cè)期末模擬考試試卷(含答案含聽力原文)
- 【10篇】新部編五年級(jí)上冊(cè)語文課內(nèi)外閱讀理解專項(xiàng)練習(xí)題及答案
- 南京市雨花臺(tái)區(qū)醫(yī)療保險(xiǎn)管理中心等單位2025年公開招聘編外工作人員備考題庫有完整答案詳解
評(píng)論
0/150
提交評(píng)論