1af994708aacfb2937e2679efd92e3c3.png

笔者之前在React-native 和Flutter 两个框架里纠结到底用什么来做下一个版本的APP,

React-native 我之前也搭建了环境看了看文档感觉上手不会很困难因为自己会React, 笔者以前是做原生android开发的,做的时间不算长就转前端了.对于android部分的原生知识还算了解,于是大胆的开始了学习flutter. 学习flutter之前我写了一个原生的andriod项目. 和一个flutter的项目,同样的功能,布局,原生的应用只有2M不到, 而flutter居然有10M 暂时让我有点吃惊,但是两者的速度几乎没有任何差别,于是花了几天的时间过了一遍Dart语言.然后就开始学习flutter的布局.可以这样的说我写过xml , Jsx . html, css 但是flutter的嵌套布局完全刷新了我的认知.

全新的语法,布局里面又有点flex的影子.css的大部分属性还是能直接看懂.由于flutter中文网暂时来说不是非常的完善,部分文档没有中文.所以自己干脆就直接上了flutter官方开始漫长的入坑.

这里步入正题.flutter中使用高德提供的插件,实现定位功能.

https://pub.dev/packages/amap_location 这是插件的链接

导入下载插件就不需要多说了吧.先来看看文档

1.先申请一个apikeyhttp://lbs.amap.com/api/android-sdk/guide/create-project/get-key

2.绑定key和SHA1

如何查看SHA1:https://lbs.amap.com/api/android-sdk/guide/create-project/get-key#sha1

准备工作就绪之后首先配置gradle

项目目录/app/build.gradle

android {
    .... 你的代码

    defaultConfig {
        .....
        manifestPlaceholders = [
                AMAP_KEY : "aa9f0cf8574400f2af0078392c556e25", /// 高德地图key
        ]

    }

    ...你的代码

    dependencies {
        /// 注意这里需要在主项目增加一条依赖,否则可能发生编译不通过的情况
        implementation 'com.amap.api:location:latest.integration'
        ...你的代码
    }


配置完成之后开始导入
import 'package:amap_location/amap_location.dart';

getLocation() async{
获取定位是异步操作,使用 async await 是最简单的官方文档也是这样写的
1.启动
2.获取定理位置
      await AMapLocationClient.startup(new AMapLocationOption( desiredAccuracy:CLLocationAccuracy.kCLLocationAccuracyHundredMeters  ));
      await AMapLocationClient.getLocation(true);

 }

在这里获取定位里面有一个坑.由于原生的模拟器非常的消耗资源,笔者用了第三方的模拟器,我用的是夜神.在android6.0之后,定位,拍照等等权限需要手动去拉权限,用户同意了之后应用程序才有权限去获取地理位置.然后第三方模拟器为了追求稳定,sdk的版本比较低.可以直接获取定位,所以在真机调试的经纬度打印出来一直是null,我还怀疑是不是key的问题.最后翻了android的文档之后发现,6.0之后必须要用户授权才能获取定位.所以开发的时候要用到对应的权限先去看看文档,是否要用户授权,如果需要先去拉取授权,拉去授权的方式很多种.官方也有推荐

void _checkPersmission() async{
    bool hasPermission = await SimplePermissions.checkPermission(Permission.WhenInUseLocation);
    if(!hasPermission){
      bool requestPermissionResult = await SimplePermissions.requestPermission(Permission.WhenInUseLocation);
      if(!requestPermissionResult){
        Alert.alert(context,title: "申请定位权限失败");
        return;
      }
    }
    AMapLocationClient.onLocationUpate.listen((AMapLocation loc) {
      if (!mounted) return;
      setState(() {
        location = getLocationStr(loc);
      });
    });

    AMapLocationClient.startLocation();
  }

拉取授权之后,就不会报错了.

07c8b814bf7b9cfbc158648e182ec6db.png

我打印的是city和citycode

定位非常的精确

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐