记录下 Flutter 集成高德地图问题

在 Flutter 项目中集成高德地图插件时发现高德地图几年没有更新,插件与现有的 Flutter 开发环境已经脱节严重,在直接引入插件后会各种报错 , 就算解决了编译报错,可运行, 打包后又无法正常运行.

1.

首先我用的是 amap_flutter_map 3.0.0 定位插件也是这个版本 , 直接引入后,项目和插件的 gradle 版本肯定冲突很大 , 这里我将插件从本机的 Pub Cache 中复制到项目根目录 plugins/xx下,然后集成

pubspec.yaml

1
2
3
4
5
# 高德地图和定位
amap_flutter_map:
path: plugins/amap_flutter_map-3.0.0
amap_flutter_location:
path: plugins/amap_flutter_location-3.0.0

2.

然后修改这两个插件对应的 gradle-wrapper.properties , 这里我将插件用的版本和项目版本进行了统一

1
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip

然后对应 android 目录下的 build.gradle 修改

1. 增加 namespace

1
2
3
android {
namespace "com.amap.flutter.amap_flutter_map"
}

location 插件对应的是

1
2
3
android {
namespace "com.amap.flutter.amap_flutter_location"
}

同时删除对应 AndroidManifest.xml 下的 packageName

2. jcenter() 替换为 -> mavenCentral()

3. 修改 gradle 版本

这里也是和主项目版本进行了同步

1
2
3
dependencies {
classpath 'com.android.tools.build:gradle:8.1.2'
}

4. compileSdkVersion 修改

与主项目同步,否则资源文件不一致,影响打包

1
compileSdkVersion 35

但是提升后,Flutter这边将找不到 hashValues 方法 , 有很多类用到这个所以报错 .

这里我们将 amap_flutter_base-3.0.0 和上面一样也拉取到本地 , 然后将 map 插件的引用指向本地

1
2
3
#  amap_flutter_base: ^3.0.0
amap_flutter_base:
path: ../amap_flutter_base-3.0.0

然后将以上三个插件的flutter环境进行修改提升 , 是为了使用 Object.hashAll([a, b, c]) 这个方法

1
2
3
environment:
sdk: ">=2.14.0 <3.0.0" # 从2.12 升级到 2.14
flutter: ">=1.20.0"

然后将所有打包所有报错的类中 hashValues 都换成 Object.hashAll(...),然后就可以正常运行及打包了

5. 其它

在使用插件的时候需要参考文档调用隐私授权, 比如地图这里是 , 否则地图将会白屏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
///建议在APP首次启动或者进行弹窗进行隐私声明时,根据用户设置
///
/// [hasContains] 隐私权政策是否包含高德开平隐私权政策
///
///[hasShow] 隐私权政策是否弹窗展示告知用户
///
///[hasAgree] 隐私权政策是否已经取得用户同意
static const AMapPrivacyStatement amapPrivacyStatement =
AMapPrivacyStatement(hasContains: true, hasShow: true, hasAgree: true);

///在创建地图时设置privacyStatement属性
final AMapWidget map = AMapWidget(
///必须正确设置的合规隐私声明,否则SDK不会工作,会造成地图白屏等问题。
privacyStatement: ConstConfig.amapPrivacyStatement,
);