Flutter 位置插件
此 Flutter 插件可处理 Android 和 iOS 上的位置获取。它还提供位置更改时的回调。

入门
Android
要在 Android 中使用此插件,您必须在 AndroidManifest.xml 中添加此权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
使用此项更新您的 gradle.properties 文件
android.enableJetifier=true
android.useAndroidX=true
org.gradle.jvmargs=-Xmx1536M
请同时确保您的 build.gradle 中有这些依赖项
dependencies {
classpath 'com.android.tools.build:gradle:3.3.0'
classpath 'com.google.gms:google-services:4.2.0'
}
...
compileSdkVersion 28
iOS
要在 iOS 中使用,您必须在 Info.plist 中添加此权限
NSLocationWhenInUseUsageDescription
NSLocationAlwaysUsageDescription
警告:目前 iOS 模拟器存在一个 bug,您必须手动选择一个位置几次,模拟器才能实际发送数据。请在测试 iOS 模拟器时牢记这一点。
示例应用
示例应用程序使用了 Google Maps Flutter Plugin,请在 AndroidManifest.xml 和 AppDelegate.m 中添加您的 API 密钥以使用 Google Maps 插件。
示例代码
然后您只需导入该包
import 'package:location/location.dart';
查看示例以了解用法,但一次性获取位置的基本实现可以这样完成
var currentLocation = LocationData;
var location = new Location();
// Platform messages may fail, so we use a try/catch PlatformException.
try {
currentLocation = await location.getLocation();
} on PlatformException catch (e) {
if (e.code == 'PERMISSION_DENIED') {
error = 'Permission denied';
}
currentLocation = null;
}
您还可以获取位置变化时的连续回调
var location = new Location();
location.onLocationChanged().listen((LocationData currentLocation) {
print(currentLocation.latitude);
print(currentLocation.longitude);
});
公共方法摘要
在此表中,您可以找到此插件公开的不同函数
| 返回 | 描述 |
|---|---|
| Future<bool> | requestPermission() 请求位置权限。返回一个布尔值以了解权限是否已获得。 |
| Future<bool> | hasPermission() 返回一个布尔值以了解位置权限的状态。 |
| Future<bool> | serviceEnabled() 返回一个布尔值以了解位置服务是否已启用,或者用户是否已手动禁用它。 |
| Future<bool> | requestService() 显示一个警报对话框以请求用户激活位置服务。在 iOS 上,由于 Apple 的指南,只会显示一个警报,用户必须手动前往设置。返回一个布尔值以了解位置服务是否已激活(在 iOS 上始终为 false)。 |
| Future<bool> | changeSettings(LocationAccuracy accuracy = LocationAccuracy.HIGH, int interval = 1000, double distanceFilter = 0) 将更改未来请求的设置。 accuracy 将描述请求的精度(请参阅 LocationAccuracy 对象)。interval 将设置活动位置更新的所需间隔(以毫秒为单位)(仅影响 Android)。distanceFilter 设置两次位置更新之间的最小位移(以米为单位)。 |
| Future<LocationData> | getLocation() 允许获取用户的一次性位置。如果尚未获得权限,它将尝试请求权限,如果权限仍未获得,则会抛出 PERMISSION_DENIED 错误代码。 |
| Stream<LocationData> | onLocationChanged() 获取用户位置的流。如果尚未获得权限,它将尝试请求权限,如果权限仍未获得,则会抛出 PERMISSION_DENIED 错误代码。 |
您应该尝试使用 requestPermission() 手动管理权限以避免错误,但该插件会尝试为您处理一些情况。
对象
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
}
enum LocationAccuracy {
POWERSAVE, // To request best accuracy possible with zero additional power consumption,
LOW, // To request "city" level accuracy
BALANCED, // To request "block" level accuracy
HIGH, // To request the most accurate locations available
NAVIGATION // To request location for navigation usage (affect only iOS)
}
注意:您可以使用以下方式将时间戳转换为 DateTime: DateTime.fromMillisecondsSinceEpoch(locationData.time.toInt())