Flutter 3.22+ 如何集成高德flutter地图并自定义marker显示
在Flutter 3.22+版本中,我想集成高德地图插件并自定义Marker的显示样式,但目前遇到了一些问题。按照官方文档集成后,地图能正常显示,但自定义Marker时无法加载本地图片或动态生成的Widget作为图标。尝试过使用BitmapDescriptor.fromAssetImage和BitmapDescriptor.fromWidget方法,要么图片不显示,要么直接报错。请问如何正确实现自定义Marker?是否需要额外配置?如果有完整的代码示例就更好了。
2 回复
Flutter 3.22+集成高德地图步骤:
- 添加依赖:
amap_flutter_map最新版 - 配置Android/iOS密钥
- 使用
AMapWidget加载地图 - 自定义Marker:通过
Marker类设置icon属性,可使用自定义Widget转图片 - 通过
Markers集合管理多个标记点
关键代码:
Marker(
position: LatLng(39.909, 116.397),
icon: BitmapDescriptor.fromBytes(customIconBytes),
)
更多关于Flutter 3.22+ 如何集成高德flutter地图并自定义marker显示的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在 Flutter 3.22+ 中集成高德地图并自定义 Marker,可按照以下步骤操作:
1. 添加依赖
在 pubspec.yaml 中添加:
dependencies:
amap_flutter_map: ^8.0.0 # 检查最新版本
运行 flutter pub get。
2. 配置权限和Key
Android (android/app/src/main/AndroidManifest.xml):
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<application>
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="你的高德Key"/>
</application>
iOS (ios/Runner/Info.plist):
<key>NSLocationWhenInUseUsageDescription</key>
<string>需要定位权限</string>
<key>AMapApiKey</key>
<string>你的高德Key</string>
3. 基本地图集成
import 'package:amap_flutter_map/amap_flutter_map.dart';
AMapWidget(
apiKey: const AMapApiKey(
iosKey: 'iOS Key',
androidKey: 'Android Key',
),
onMapCreated: (controller) {
// 地图创建回调
},
)
4. 自定义Marker
// 定义Marker
final List<Marker> _markers = [
Marker(
position: const LatLng(39.90960, 116.397228),
icon: BitmapDescriptor.defaultMarkerWithHue(
BitmapDescriptor.hueRed, // 使用预设颜色
),
infoWindow: const InfoWindow(
title: '自定义Marker',
snippet: '这是描述信息',
),
),
Marker(
position: const LatLng(39.90960, 116.397228),
icon: BitmapDescriptor.fromBytes(await _getBytesFromAsset(
'assets/custom_icon.png',
100, // 宽度
)), // 自定义图标
),
];
// 在AMapWidget中使用
AMapWidget(
markers: Set<Marker>.of(_markers),
// 其他参数...
)
// 从Assets加载自定义图标
Future<Uint8List> _getBytesFromAsset(String path, int width) async {
ByteData data = await rootBundle.load(path);
ui.Codec codec = await ui.instantiateImageCodec(data.buffer.asUint8List(), targetWidth: width);
ui.FrameInfo fi = await codec.getNextFrame();
return (await fi.image.toByteData(format: ui.ImageByteFormat.png))!.buffer.asUint8List();
}
5. 动态更新Marker
// 通过AMapController更新
final AMapController? _mapController;
void _updateMarker() {
_mapController?.updateMarker(Marker(
markerId: MarkerId('custom_marker'),
position: LatLng(新的纬度, 新的经度),
icon: BitmapDescriptor.fromBytes(await _getBytesFromAsset(...)),
));
}
注意事项:
- 确保在高德开放平台申请正确的Key
- iOS需要额外配置
io.flutter.embedded_views_preview为true - 自定义图标建议使用PNG格式,尺寸不宜过大
- 注意处理位置权限申请
通过以上步骤即可在Flutter 3.22+中集成高德地图并实现自定义Marker显示。

