Flutter中如何将经纬度列表转换为Marker类型列表
解决方法:将Map列表转换为Marker列表
你可以通过两种常用方式实现转换,下面分别说明:
方式一:使用forEach循环遍历转换
先清空原有的markers列表,再遍历positionMarkers逐个创建Marker并添加进去:
// 在MapMarkers类中添加初始化方法 void initMarkers() { markers.clear(); for (var markerData in positionMarkers) { final marker = Marker( markerId: MarkerId(markerData['id'].toString()), // 将int类型的id转为String position: LatLng( markerData['lat'] as double, markerData['lng'] as double, ), infoWindow: InfoWindow( title: 'Marker ${markerData['id']}', // 可选:给信息窗添加标题 ), ); markers.add(marker); } notifyListeners(); // 通知UI更新 }
方式二:使用map方法(更简洁)
利用Dart的map方法直接将positionMarkers映射为List<Marker>,写法更简洁高效:
// 可以直接替换原有markers的初始化,或在方法中赋值 List<Marker> get convertedMarkers => positionMarkers.map((data) { return Marker( markerId: MarkerId(data['id'].toString()), position: LatLng(data['lat'] as double, data['lng'] as double), infoWindow: InfoWindow(title: 'Marker ${data['id']}'), ); }).toList();
修改后的完整类代码
如果希望初始化时就完成转换,可直接在构造函数中处理:
import 'package:flutter/material.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; class MapMarkers with ChangeNotifier { List<Map<String, dynamic>> positionMarkers = [ { 'id': 1, 'lat': 22.6434340, 'lng': 88.446740, }, { 'id': 2, 'lat': 22.6435442, 'lng': 88.456742, }, { 'id': 3, 'lat': 22.6436544, 'lng': 88.466744, }, { 'id': 4, 'lat': 22.6437646, 'lng': 88.476746, }, {'id': 5, 'lat': 22.6438748, 'lng': 88.486748} ]; late List<Marker> markers; MapMarkers() { // 初始化阶段完成转换 markers = positionMarkers.map((data) { return Marker( markerId: MarkerId(data['id'].toString()), position: LatLng(data['lat'] as double, data['lng'] as double), infoWindow: InfoWindow(title: 'Marker ${data['id']}'), ); }).toList(); } }
注意事项
MarkerId要求传入字符串类型,需将原数据中的int类型id转换为StringLatLng的参数为double类型,确保从Map中取出的lat和lng正确转换为double- 若后续动态更新标记列表,记得调用
notifyListeners()触发UI刷新
内容的提问来源于stack exchange,提问作者coolhack7
相关产品推荐
相关产品推荐

