📜  Flutter中的地理定位器

📅  最后修改于: 2022-05-13 01:54:51.884000             🧑  作者: Mango

Flutter中的地理定位器

在支付、地图和电子商务等应用程序中访问用户位置非常常见。位置访问也广泛用于物品跟踪。在本文中,我们将研究以下内容 -

  • 获得许可
  • 访问设备的最后位置
  • 访问当前位置
  • 访问位置的持续更新

本文仅关注来自 Android 的用户位置。

添加依赖

要使用 geolocator,我们首先将其安装为pubspec.yaml文件中的依赖项。为此,请在依赖项部分下提及地理定位器。

添加依赖

导入依赖

Dart
import 'package:geolocator/geolocator.dart';


Dart
Position? position;


Dart
LocationPermission permission = await Geolocator.requestPermission();


Dart
LocationPermission permission = await Geolocator.checkPermission();


Dart
getCurrentPosition() async {
    position = await Geolocator.getCurrentPosition(
        desiredAccuracy: LocationAccuracy.high);
    return position;
  }


Dart
getLastPosition() async {
    position = await Geolocator.getLastKnownPosition();
    return position;
  }


Dart
StreamSubscription serviceStatusStream =
        Geolocator.getServiceStatusStream().listen((ServiceStatus status) {
      print(status);
    });


Dart
final LocationSettings locationSettings = LocationSettings(accuracy: LocationAccuracy.best, distanceFilter: 0);


Dart
getLocationUpdates() {
    final LocationSettings locationSettings =
        LocationSettings(accuracy: LocationAccuracy.best, distanceFilter: 0);
  
    StreamSubscription serviceStatusStream =
        Geolocator.getServiceStatusStream().listen((ServiceStatus status) {
      print(status);
    });
  }


设置

在我们进入编码部分之前,我们必须做一些设置。

1.在 android/app/build.gradle 中设置 compileSDKVersion 为 31

2.android/app/src/main/AndroidManifest.xml文件中授予用户访问设备位置的权限。

3.在 android/gradle.properties 中设置以下属性:

执行

让我们在将在整篇文章中讨论的类中定义位置。位置是一个不可为空的变量。

Dart

Position? position;

请求许可

如果应用程序需要用户的许可才能访问位置,我们在 Geolocator 上使用 requestPermission() 方法,以便它可以执行位置操作。

Dart

LocationPermission permission = await Geolocator.requestPermission();

检查权限

要确定位置服务是否启用,我们可以在 Geolocator 上调用 checkPermission()。

Dart

LocationPermission permission = await Geolocator.checkPermission();

获取当前位置

让我们创建一个函数getCurrentPosition(),它在 Geolocator 上调用 getCurrentPosition() 方法,并返回设备的位置。

Dart

getCurrentPosition() async {
    position = await Geolocator.getCurrentPosition(
        desiredAccuracy: LocationAccuracy.high);
    return position;
  }

输出:

输出

当我们按下 GET 按钮时,它调用 getCurrentPosition() 并返回位置,它给出了我们在屏幕上显示的纬度和经度。

获取最后一个位置

要获取最后一个位置,我们使用 getLastKnownPosition() 方法。我们正在定义 getLastPosition() 方法来获取其中的最后一个已知位置,然后返回它。返回的位置也会告诉设备的经度和纬度。

Dart

getLastPosition() async {
    position = await Geolocator.getLastKnownPosition();
    return position;
  }

输出:

访问位置的持续更新

为了获得持续的位置更新,我们需要订阅服务流——

Dart

StreamSubscription serviceStatusStream =
        Geolocator.getServiceStatusStream().listen((ServiceStatus status) {
      print(status);
    });

我们可以设置位置设置,例如我们想要的精度和距离过滤器,它会在设备水平移动距离过滤器距离时给出位置。

Dart

final LocationSettings locationSettings = LocationSettings(accuracy: LocationAccuracy.best, distanceFilter: 0);

然后,我们定义了一个函数getLocationUpdates(),以便在我们想要获取位置更新时调用。

Dart

getLocationUpdates() {
    final LocationSettings locationSettings =
        LocationSettings(accuracy: LocationAccuracy.best, distanceFilter: 0);
  
    StreamSubscription serviceStatusStream =
        Geolocator.getServiceStatusStream().listen((ServiceStatus status) {
      print(status);
    });
  }

输出:

我们获得的位置是恒定的,因为设备没有移动。