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);
});
}
输出:
我们获得的位置是恒定的,因为设备没有移动。