本文所介绍的获取地理位置信息的Flutter插件是基于高德地图的,所以前期需要针对高德平台做一些准备工作。
1. 申请高德地图的KEY
1. Android版本申请
参考:http://lbs.amap.com/api/android-sdk/guide/create-project/get-key
2. IOS版本申请
参考:http://lbs.amap.com/api/ios-sdk/guide/create-project/get-key
2. 项目中集成高德地图
1. Android版本集成
代码如下:
android {
defaultConfig {
manifestPlaceholders = [
AMAP_KEY : "aa9f0cf8574400f2af0078392c556e25",
]
}
dependencies {
implementation 'com.amap.api:location:latest.integration'
}
}
2. IOS版本集成
代码如下:
import 'package:flutter/material.dart';
// 引入地理定位
import 'package:amap_location/amap_location.dart';
// 主函数
void main(){
// 初始化
AMapLocationClient.setApiKey("aa9f0cf8574400f2af0078392c556e25");
runApp(MyApp());
}
由于苹果上架审核比较严格,所以在info.list中必须描述清楚app使用定位的目的,如果写的不清楚,可能会被苹果拒绝上架,代码如下:
<key>NSLocationWhenInUseUsageDescription</key>
<string>要用定位</string>
3. 使用map_location获取地理位置
1. 安装插件
配置 amap_location 插件。
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
date_format: ^1.0.6
flutter_cupertino_date_picker: ^1.0.26+2
flutter_swiper: ^1.1.6
fluttertoast: ^7.1.6
http: ^0.12.2
dio: ^3.0.10
flutter_html: ^1.1.0
flutter_inappwebview: ^4.0.0+4
device_info: ^1.0.0
# 地理定位
amap_location: ^0.2.0
在pubspec.yaml中配置保存后,在VS Code环境中会自动下载依赖包。
如果无法正常下载,执行 flutter pub get 。
2. 引入插件
在需要用到的该插件的文件中引入插件包。
import 'package:amap_location/amap_location.dart';
3. 使用插件
(1). 启动
// 启动一下
await AMapLocationClient.startup(new AMapLocationOption(
desiredAccuracy: CLLocationAccuracy.kCLLocationAccuracyHundredMeters
));
(2). 获取地理位置
// 获取地理位置
var result = await AMapLocationClient.getLocation(true);
setState(() {
this._longitude = result.longitude;
this._latitude = result.latitude;
});
(3). 监听地理位置改变
// 监听地理位置改变
AMapLocationClient.onLocationUpate.listen((AMapLocation loc){
if(!mounted)return;
setState(() {
// ...
// ...
});
});
AMapLocationClient.startLocation();
(4). 停止监听定位
AMapLocationClient.stopLocation();
(5). 消毁监听事件
void dispose() {
// 注意这里关闭
AMapLocationClient.shutdown();
super.dispose();
}
(6). 代码示例
import 'package:flutter/material.dart';
import 'package:amap_location/amap_location.dart';
class LocationPage extends StatefulWidget {
LocationPage({Key key}) : super(key: key);
_LocationPageState createState() => _LocationPageState();
}
class _LocationPageState extends State<LocationPage> {
double _longitude = 0;
double _latitude = 0;
@override
void initState() {
super.initState();
// 获取地理定位
this._getLocation();
}
void _getLocation() async {
// 启动一下
await AMapLocationClient.startup(new AMapLocationOption(
desiredAccuracy: CLLocationAccuracy.kCLLocationAccuracyHundredMeters
));
// 获取地理位置
var result = await AMapLocationClient.getLocation(true);
setState(() {
this._longitude = result.longitude;
this._latitude = result.latitude;
});
}
// 监听地理位置
// void _listenLocation(){
// AMapLocationClient.onLocationUpate.listen((AMapLocation loc){
// if(!mounted)return;
// setState(() {
// });
// });
// AMapLocationClient.startLocation();
// }
// // 停止监听地理位置
// void _stopListenLocation(){
// AMapLocationClient.stopLocation();
// }
@override
void dispose() {
// 关闭
AMapLocationClient.shutdown();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("地理定位"),
),
body: Center(
child:Column(
children: <Widget>[
Text("经度:${this._longitude}"),
Text("纬度:${this._latitude}"),
],
)
)
);
}
}