最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Flutter定位包獲取地理位置

 更新時間:2021年11月29日 11:06:04   作者:早起的年輕人-堅果の博客  
本文詳細講解了使用Flutter定位包獲取地理位置的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

Flutter 中獲取地理位置

如今,發(fā)現(xiàn)用戶位置是移動應用程序非常常見且功能強大的用例。如果您曾經(jīng)嘗試過在 Android 中實現(xiàn)位置,您就會知道樣例代碼會變得多么復雜和混亂。

但這與 Flutter 不同——它有很多令人驚嘆的包,可以為您抽象出樣板代碼,并使實現(xiàn)地理定位成為夢想。另一個好的方面是您可以在 Android 和 iOS 上獲得這些功能。

讓我們快速瀏覽一下我們今天正在構建的用于收集位置數(shù)據(jù)的內(nèi)容:

Flutter 地理定位演示

本文將帶您了解兩個最流行且易于使用的 Flutter 地理定位包。

讓我們從location開始,這是Flutter 最喜歡的包。這很簡單。只需三個簡單的步驟,您就可以獲取當前用戶位置以及處理位置權限。

先決條件

在繼續(xù)前進之前,讓我們快速檢查一下我們需要的東西:

  • FlutterSDK
  • 編輯器:您可以使用 Visual Code 或 Android Studio
  • 至少對 Flutter 有初級的了解

差不多就是這樣!

使用 Flutter 定位包

設置

將依賴項添加到您的文件中:pubspec.yaml

    location: ^4.3.0

由于 Android 和 iOS 處理權限的方式不同,因此我們必須在每個平臺上分別添加它們。

安卓版

將以下位置權限添加到:AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

如果您還想在后臺訪問用戶的位置,請在訪問后臺位置之前使用該API,并在清單文件中添加后臺權限:enableBackgroundMode({bool enable})

<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>

對于 iOS

將以下位置權限添加到:Info.plist

<key>NSLocationWhenInUseUsageDescription</key> 
<string>此應用需要訪問您的位置</string>

NSLocationWhenInUseUsageDescription是您需要的唯一許可。這也允許您訪問后臺位置,唯一需要注意的是,當應用程序在后臺訪問位置時,狀態(tài)欄中會顯示藍色徽章。與 Android 不同,我們在其中添加了單獨的權限以在后臺訪問用戶的位置。

位置權限

我們需要在請求用戶位置之前檢查位置服務狀態(tài)和權限狀態(tài),這可以使用以下幾行代碼輕松完成:

Location location = new Location();

bool _serviceEnabled;
PermissionStatus _permissionGranted;

_serviceEnabled = await location.serviceEnabled();
if (!_serviceEnabled) {
 _serviceEnabled = await location.requestService();
 if (!_serviceEnabled) {
   return null;
 }
}

_permissionGranted = await location.hasPermission();
if (_permissionGranted == PermissionStatus.denied) {
 _permissionGranted = await location.requestPermission();
 if (_permissionGranted != PermissionStatus.granted) {
   return null;
 }
}

首先,我們創(chuàng)建一個由Location()包提供的對象,location反過來為我們提供了兩個有用的方法。檢查設備位置是否已啟用或用戶是否已手動禁用它。``serviceEnabled()

對于后者,我們顯示了一個原生提示,允許用戶通過調(diào)用快速啟用位置,然后我們再檢查一次,如果他們從提示中啟用了它。requestService()

一旦我們確定啟用了位置服務,下一步就是通過調(diào)用它來檢查我們的應用程序是否具有使用它的必要權限,這將返回.hasPermission()``PermissionStatus

PermissionStatus是可以具有以下三個值之一的枚舉:

  • PermissionStatus.granted: 定位服務權限已被授予
  • PermissionStatus.denied: 定位服務權限被拒絕
  • PermissionStatus.deniedForever: 位置服務權限被用戶永久拒絕。這僅適用于 iOS。在這種情況下不會顯示對話框requestPermission()

如果狀態(tài)為 ,我們可以通過調(diào)用顯示請求位置權限的系統(tǒng)提示。對于 status,我們可以立即訪問 location,因此我們返回一個.denied,``requestPermission()``granted``null

如果您還想在后臺訪問用戶位置,請使用。location.enableBackgroundMode(enable: **true**)

獲取當前位置

如果位置服務可用并且用戶已授予位置權限,那么我們只需兩行代碼即可獲取用戶位置 - 不,我不是在開玩笑:

LocationData _locationData;
_locationData = await location.getLocation();

LocationData類提供以下位置信息:

class LocationData {
  final double latitude; // Latitude, in degrees
  final double longitude; // Longitude, in degrees
  final double accuracy; // Estimated horizontal accuracy of this location, radial, in meters
  final double altitude; // In meters above the WGS 84 reference ellipsoid
  final double speed; // In meters/second
  final double speedAccuracy; // In meters/second, always 0 on iOS
  final double heading; // Heading is the horizontal direction of travel of this device, in degrees
  final double time; // timestamp of the LocationData
  final bool isMock; // Is the location currently mocked
}

您還可以通過添加onLocationChanged偵聽器在用戶位置發(fā)生變化時監(jiān)聽位置更新來獲得連續(xù)回調(diào),這是出租車應用程序、司機/騎手應用程序等的一個很好的用例:

location.onLocationChanged.listen((LocationData currentLocation) {
  // current user location
});

注意,一旦您想停止收聽更新,請不要忘記取消流訂閱。

瞧!現(xiàn)在我們有了用戶位置的當前緯度和經(jīng)度值。

讓我們利用這些緯度和經(jīng)度值來獲取用戶的完整地址或反向地理編碼。

為此,我們將使用另一個驚人的 Flutter 包:geocode。

使用 Flutter 地理編碼包

設置

將依賴項添加到您的文件中:pubspec.yaml

dependencies:
    geocode: 1.0.1

獲取地址

獲取地址再簡單不過了。就打電話吧。就是這樣!帶有空檢查的完整函數(shù)如下所示:reverseGeocoding(latitude: lat, longitude: lang)

Future<String> _getAddress(double? lat, double? lang) async {
 if (lat == null || lang == null) return "";
 GeoCode geoCode = GeoCode();
 Address address =
     await geoCode.reverseGeocoding(latitude: lat, longitude: lang);
 return "${address.streetAddress}, ${address.city}, ${address.countryName}, ${address.postal}";
}

沒那么簡單!

完整的代碼如下所示:

class GetUserLocation extends StatefulWidget {
 GetUserLocation({Key? key, required this.title}) : super(key: key);
 final String title;

 @override
 _GetUserLocationState createState() => _GetUserLocationState();
}

class _GetUserLocationState extends State<GetUserLocation> {
 LocationData? currentLocation;
 String address = "";

 @override
 Widget build(BuildContext context) {
   return Scaffold(
     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) {
                   LocationData? location = value;
                   _getAddress(location?.latitude, location?.longitude)
                       .then((value) {
                     setState(() {
                       currentLocation = location;
                       address = value;
                     });
                   });
                 });
               },
               color: Colors.purple,
               child: Text(
                 "Get Location",
                 style: TextStyle(color: Colors.white),
               ),
             ),
           ],
         ),
       ),
     ),
   );
 }

 Future<LocationData?> _getLocation() async {
   Location location = new Location();
   LocationData _locationData;

   bool _serviceEnabled;
   PermissionStatus _permissionGranted;

   _serviceEnabled = await location.serviceEnabled();
   if (!_serviceEnabled) {
     _serviceEnabled = await location.requestService();
     if (!_serviceEnabled) {
       return null;
     }
   }

   _permissionGranted = await location.hasPermission();
   if (_permissionGranted == PermissionStatus.denied) {
     _permissionGranted = await location.requestPermission();
     if (_permissionGranted != PermissionStatus.granted) {
       return null;
     }
   }


   _locationData = await location.getLocation();

   return _locationData;
 }

 Future<String> _getAddress(double? lat, double? lang) async {
   if (lat == null || lang == null) return "";
   GeoCode geoCode = GeoCode();
   Address address =
       await geoCode.reverseGeocoding(latitude: lat, longitude: lang);
   return "${address.streetAddress}, ${address.city}, ${address.countryName}, ${address.postal}";
 }
}

常見的陷阱

盡管這些軟件包讓我們的生活變得更輕松,而且我們不必處理在 Android 和 iOS 中本地訪問位置的復雜過程,但您可能會面臨很多問題。讓我們來看看它們以及可以幫助您修復這些問題的步驟:

  • 應用內(nèi)存泄漏:如果您一直在收聽位置更新,請確保取消流訂閱,一旦您想停止收聽更新
  • 用戶必須接受位置權限才能始終允許使用后臺位置。位置權限對話框提示中未顯示始終允許的 Android 11 選項。用戶必須從應用程序設置中手動啟用它
  • 用戶可能在 iOS 上永遠拒絕定位,因此不會顯示要求定位權限的本機提示。確保處理這種邊緣情況requestPermisssions()
  • 用戶可能隨時從應用程序設置中撤銷位置權限,因此在訪問位置數(shù)據(jù)之前,請確保在應用程序恢復時檢查它們

結論

由于 Flutter 簡化了訪問位置,因此我們作為開發(fā)人員可能會立即將其添加到我們的應用程序中。但同時,我們需要確保我們的應用程序真正適合請求用戶位置并利用它為用戶增加一些價值的用例,而不是僅僅將位置數(shù)據(jù)發(fā)送到服務器。

隨著即將推出的 Android 和 iOS 操作系統(tǒng)版本中安全性和隱私性的提高,訪問位置數(shù)據(jù)而不向用戶提供價值可能會導致您的應用程序被商店拒絕。有很多很好的用例,您可以使用用戶位置,例如,根據(jù)用戶位置為食品/外賣應用程序個性化主屏幕,該應用程序顯示按用戶當前位置的接近程度訂購的餐廳。取件/送貨應用程序是最常見的用例。

您還可以在您實際想要使用的特定屏幕上詢問用戶位置,而不是立即在主屏幕上詢問。這使用戶更清楚,并且他們不太可能拒絕位置權限。

到此這篇關于使用Flutter定位包獲取地理位置的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android自動測試工具Monkey

    Android自動測試工具Monkey

    Monkey是Android中的一個命令行工具,可以運行在模擬器里或實際設備中。它向系統(tǒng)發(fā)送偽隨機的用戶事件流(如按鍵輸入、觸摸屏輸入、手勢輸入等),實現(xiàn)對正在開發(fā)的應用程序進行壓力測試。Monkey測試是一種為了測試軟件的穩(wěn)定性、健壯性的快速有效的方法
    2016-01-01
  • Kotlin入門教程之開發(fā)環(huán)境搭建

    Kotlin入門教程之開發(fā)環(huán)境搭建

    最近kotlin大熱,Kotlin作為 Android 領域的 Swift,絕對讓你如沐春風,下面這篇文章主要給大家介紹了關于Kotlin入門教程之開發(fā)環(huán)境搭建的相關資料,文中將實現(xiàn)的方法一步步介紹的非常詳細,需要的朋友可以參考下。
    2017-10-10
  • 一步步實現(xiàn)Viewpager卡片翻頁效果

    一步步實現(xiàn)Viewpager卡片翻頁效果

    一步步實現(xiàn)Viewpager卡片翻頁效果,文章很精彩,實現(xiàn)步驟很詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Github簡單易用的?Android?ViewModel?Retrofit框架

    Github簡單易用的?Android?ViewModel?Retrofit框架

    這篇文章主要介紹了Github簡單易用的Android?ViewModel?Retrofit框架,RequestViewMode有自動對LiveData進行緩存管理,每個retrofit api接口復用一個livedata的優(yōu)勢。下文具體詳情,感興趣的小伙伴可以參考一下
    2022-06-06
  • Android Fragment 和 FragmentManager 的代碼分析

    Android Fragment 和 FragmentManager 的代碼分析

    這篇文章主要介紹了Android Fragment 和 FragmentManager 的代碼分析,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧
    2017-01-01
  • Android使用URLConnection提交請求的實現(xiàn)

    Android使用URLConnection提交請求的實現(xiàn)

    這篇文章主要為大家詳細介紹了Android使用URLConnection提交請求的實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Android中ListView異步加載圖片錯位、重復、閃爍問題分析及解決方案

    Android中ListView異步加載圖片錯位、重復、閃爍問題分析及解決方案

    在Android所有系統(tǒng)自帶的控件當中,ListView這個控件算是用法比較復雜的了,關鍵是用法復雜也就算了,它還經(jīng)常會出現(xiàn)一些稀奇古怪的問題,讓人非常頭疼,下面通過本篇文章給大家分享Android中ListView異步加載圖片錯位、重復、閃爍問題分析及解決方案,需要朋友可以參考
    2015-08-08
  • 輕松實現(xiàn)Rxjava定時器功能

    輕松實現(xiàn)Rxjava定時器功能

    這篇文章主要為大家詳細介紹了Rxjava實現(xiàn)定時器功能的兩種方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Android資源文件與層次式導航超詳細講解

    Android資源文件與層次式導航超詳細講解

    這篇文章主要介紹了Android資源文件與層次式導航,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-12-12
  • Android利用shape實現(xiàn)各種簡單的形狀

    Android利用shape實現(xiàn)各種簡單的形狀

    這篇文章主要給大家介紹了關于Android中利用shape實現(xiàn)各種簡單的形狀的相關資料,文中給出了詳細的示例代碼供大家參考學習,需要的朋友們下面跟著小編一起來學習學習吧。
    2017-05-05

最新評論

宁陕县| 莱芜市| 常州市| 拜城县| 舞钢市| 深州市| 花莲市| 高清| 万山特区| 华容县| 夹江县| 上饶县| 巩留县| 神池县| 天柱县| 青神县| 连山| 临西县| 高雄市| 南平市| 太湖县| 青神县| 东兴市| 商河县| 沅陵县| 武平县| 吴桥县| 甘孜县| 阿拉善盟| 崇义县| 化德县| 吉首市| 岱山县| 和政县| 泰和县| 宣武区| 陕西省| 巧家县| 永州市| 平度市| 洞头县|