Flutter中使用amap_location获取地理位置信息

本文所介绍的获取地理位置信息的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}"),
                    ],
                )
            )
        );
    }
}

参考:https://pub.flutter-io.cn/packages/amap_location

猜你喜欢

转载自blog.csdn.net/weixin_40629244/article/details/112453350