Flutter地图服务插件flutter_amap_base的使用
Flutter地图服务插件flutter_amap_base
的使用
高德地图Flutter插件 基于AndroidView和UiKitView
[TOC]
功能
包括 地图、导航、查询、定位
资源
Android端引入最新资源包:
implementation 'com.amap.api:navi-3dmap:9.8.2_3dmap9.8.2'
implementation 'com.amap.api:search:9.7.0'
iOS端自动引入最新版本:
- AMapFoundation (1.8.2)
- AMapLocation (2.10.0):
- AMapFoundation (>= 1.8.0)
- AMapNavi (9.8.0):
- AMapFoundation (>= 1.8.2)
- AMapSearch (9.7.0):
- AMapFoundation (>= 1.8.0)
Android项目默认集成了androidx
使用方法:
引入插件:
dependencies:
flutter_amap_base:
git:
url: http://code.tengfeiyc.com/Liyadong/amap_base.git
path: base
导入:
import 'package:flutter_amap_base/amap_base.dart';
Android端设置key:
在AndroidManifest.xml
中添加:
<application>
...
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="您的Key"/>
</application>
iOS端设置key:
调用以下方法初始化:
await AMap.init('您的key'); // 这个方法在Android端无效
注意:
iOS端的UiKitView
目前还只是preview状态,默认不支持,需要手动打开开关。在Info.plist
文件中新增一行:
<key>io.flutter.embedded_views_preview</key>
<string>true</string>
关于高德的Android SDK和iOS SDK
由于Android和iOS端的实现完全不同,Android端模仿了Google Map的API设计,而iOS端没有模仿Google Map的设计,因此需要额外的工作来兼容两个平台的功能。此库的目标是尽可能地统一双端API设置,采用取各自平台API的并集,并在文档中明确指出哪些API对哪个平台有效。
关于包的大小
已经按照高德提供的各个子包分出了四个分支(2D地图暂无支持计划):
feature/map
分支依赖高德3D地图库。feature/location
分支依赖高德定位库。feature/navi
分支依赖高德导航库(Navi库已包含3D地图库,避免重复引用)。feature/search
分支依赖高德搜索库。
关于Swift项目
Swift项目需要注释掉Podfile
中的use_framework!
。尝试在podspec
中添加static_framework = true
,但会导致找不到pod里的头文件。如果有人有更好的解决方案,请告知。
关于项目结构
项目结构按照高德官方的4个子包(不包括2D地图)组织,分为地图
、定位
、导航
、搜索
四大模块。
|-- me.yohom.amapbase
|-- `AMapBasePlugin`: Flutter插件类
|-- `FunctionRegistry`: 功能登记处,所有功能都需要在此处注册。
|-- `IMapMethodHandler`: **处理委托对象**接口。
|-- common: 通用代码
|-- map: 地图功能模块
|-- MapHandlers
|-- MapModels: 数据模型
|-- `AMapFactory`: AMapView工厂,Flutter的platform view需要
|-- navi: 导航功能模块
|-- NaviHandlers
|-- NaviModels: 数据模型
|-- search: 搜索功能模块
|-- SearchHandlers
|-- SearchModels: 数据模型
|-- location: 定位功能模块
|-- LocationHandlers
|-- LocationModels: 数据模型
FAQ:
-
为什么定位到非洲去了?
- 实际上是定位到了经纬度(0, 0)的位置,位于非洲西部的几内亚湾附近,原因是Key设置错误,建议检查Key的设置。
-
为什么Android端用Flutter运行后崩溃,但是直接用Android SDK运行成功?
- 指定项目的编译选项
Additional arguments
增加--target-platform android-arm
。可以通过以下路径找到设置选项:- 从下图打开选项对话框:
- 在VS Code中配置方式可以参考:配置方式。
- 从下图打开选项对话框:
- 指定项目的编译选项
TODO LIST:
地图
- 创建地图
- 显示地图 ✅
- 显示定位蓝点 ✅
- 显示室内地图 ✅
- 切换地图图层 ✅
- 使用离线地图 ✅
- 显示英文地图 ✅
- 自定义地图 ✅
- 与地图交互
- 控件交互 ✅
- 手势交互 ✅
- 调用方法交互 ✅
- 地图截屏功能 ✅
- 在地图上绘制
- 绘制点标记 ✅
- 绘制折线 ✅
- 绘制面 ❌
- 轨迹纠偏 ❌
- 点平滑移动 ❌
- 绘制海量点图层 ❌
- 地图计算工具
- 坐标转换 ✅
- 距离/面积计算 ✅
- 距离测量 ✅
搜索
- 获取地图数据
- 获取POI数据 ✅
- 获取地址描述数据 ✅
- 获取行政区划数据 ❌
- 获取公交数据 ❌
- 获取天气数据 ❌
- 获取业务数据(云图功能) ❌
- 获取交通态势信息 ❌
- 出行线路规划
- 驾车出行路线规划 ✅
- 步行出行路线规划 ❌
- 公交出行路线规划 ❌
- 骑行出行路线规划 ❌
- 货车出行路线规划 ❌
导航
- 导航组件
- 使用导航组件 ✅
- 出行路线规划
- 驾车路线规划 ❌
- 货车路线规划 ❌
- 步行路线规划 ❌
- 骑行路线规划 ❌
- 在地图上导航
- 实时导航 ❌
- 模拟导航 ❌
- 智能巡航 ❌
- 传入外部GPS数据 ❌
- 导航UI定制化 ❌
- HUD导航模式
- HUD导航 ❌
- 获取导航数据
- 导航数据 ❌
- 语音播报
- 语音合成 ❌
定位
- 获取位置
- 获取定位数据 ✅
- 辅助功能
- 地理围栏 ❌
- 坐标转换与位置判断 ❌
完整示例Demo
以下是一个完整的Flutter项目示例,展示如何使用flutter_amap_base
插件加载高德地图并在地图上添加一个简单的标注。
main.dart
import 'package:flutter/material.dart';
import 'package:flutter_amap_base/amap_base.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: MapScreen(),
);
}
}
class MapScreen extends StatefulWidget {
[@override](/user/override)
_MapScreenState createState() => _MapScreenState();
}
class _MapScreenState extends State<MapScreen> {
late AMapController aMapController;
[@override](/user/override)
void initState() {
super.initState();
AMap.init('您的key');
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("高德地图示例"),
),
body: Stack(
children: [
AMapWidget(
apiKey: "您的key",
onMapCreated: (controller) {
aMapController = controller;
// 初始化完成后,可添加标注
addMarker();
},
),
],
),
);
}
void addMarker() async {
final markerOptions = MarkerOptions(
position: LatLng(39.90960, 116.39722), // 北京坐标
title: "北京",
snippet: "这是北京",
);
await aMapController.addMarker(markerOptions);
}
}
更多关于Flutter地图服务插件flutter_amap_base的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter地图服务插件flutter_amap_base的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
flutter_amap_base
是一个 Flutter 插件,用于在 Flutter 应用中集成高德地图(AMap)服务。通过这个插件,你可以在应用中显示地图、添加标记、绘制路线等。以下是使用 flutter_amap_base
的基本步骤和示例代码。
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 flutter_amap_base
依赖:
dependencies:
flutter:
sdk: flutter
flutter_amap_base: ^0.2.0 # 请检查最新版本
然后运行 flutter pub get
来安装依赖。
2. 配置 Android 和 iOS 项目
Android 配置
在 android/app/src/main/AndroidManifest.xml
文件中添加高德地图的 API Key:
<application>
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="YOUR_AMAP_API_KEY"/>
</application>
确保你已经在高德开发者平台上注册并获取了 API Key。
iOS 配置
在 ios/Runner/Info.plist
文件中添加高德地图的 API Key:
<key>AMapApiKey</key>
<string>YOUR_AMAP_API_KEY</string>
3. 使用 flutter_amap_base
显示地图
你可以在 Flutter 应用中使用 AMap
组件来显示地图:
import 'package:flutter/material.dart';
import 'package:flutter_amap_base/flutter_amap_base.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter AMap Example'),
),
body: AMapView(
onMapCreated: (controller) {
// 地图创建完成后的回调
},
),
),
);
}
}
添加标记
你可以使用 AMapMarker
类来在地图上添加标记:
AMapView(
onMapCreated: (controller) {
controller.addMarker(AMapMarker(
position: LatLng(39.9042, 116.4074), // 北京
title: 'Beijing',
snippet: 'Capital of China',
));
},
),
绘制路线
你可以使用 AMapPolyline
类来绘制路线:
AMapView(
onMapCreated: (controller) {
controller.addPolyline(AMapPolyline(
points: [
LatLng(39.9042, 116.4074), // 北京
LatLng(31.2304, 121.4737), // 上海
],
width: 5,
color: Colors.blue,
));
},
),
4. 处理地图事件
你可以通过 AMapController
来处理地图的各种事件,例如点击标记、地图移动等:
AMapView(
onMapCreated: (controller) {
controller.onMarkerTapped.listen((marker) {
print('Marker tapped: ${marker.title}');
});
controller.onCameraMove.listen((cameraPosition) {
print('Camera moved to: ${cameraPosition.target}');
});
},
),