使用Flutter定位包獲取地理位置_第1頁
使用Flutter定位包獲取地理位置_第2頁
使用Flutter定位包獲取地理位置_第3頁
使用Flutter定位包獲取地理位置_第4頁
使用Flutter定位包獲取地理位置_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論