Flutter中API数据动态生成Google Map标记不显示如何解决?
问题排查与解决步骤
1. 修复接口数据转模型错误
你当前的getLocations函数直接把jsonDecode返回的动态类型结果当做模型列表返回,会抛出类型不匹配异常,最终触发catch逻辑返回空列表,没有数据自然生成不了Marker。
修正后代码:
Future<List<LiveVehicleTrackingModel>> getLocations() async { try { var url = ApiConstants.liveTrackingApi; final resp = await http.post(Uri.parse(url)); // 先判断接口请求是否成功 if (resp.statusCode == 200) { final List<dynamic> responseBody = jsonDecode(resp.body); // 遍历转换为模型对象 return responseBody.map((item) => LiveVehicleTrackingModel.fromJson(item)).toList(); } return []; } catch (e) { // 打印错误方便排查 print('获取位置数据错误: $e'); return []; } }
2. 修复Marker ID重复问题
Google Map要求每个Marker的markerId必须唯一,你当前用accStatus作为ID,多个车辆状态相同的话会导致Marker被覆盖,甚至不显示。建议用车辆唯一标识,没有的话可以用循环索引:
markerId: MarkerId(i.toString()), // 有车辆唯一ID的话优先用车辆ID
3. 取消setState注释,通知界面刷新
Flutter的状态变更需要主动调用setState通知框架重绘UI,你当前注释了这行代码,allMarkers列表更新后地图组件收不到通知,自然不会渲染新的Marker。同时建议添加空值判断、日志打印逻辑方便排查:
修正后的loadLocations函数:
LatLng latlng; loadLocations() async { // 先清空旧的Marker,避免重复添加 allMarkers.clear(); List<LiveVehicleTrackingModel> locations = await getLocations(); // 打印返回的数量,确认是否拿到数据 print('获取到的车辆数量: ${locations.length}'); for (var i = 0; i < locations.length; i++) { // 判空避免空指针异常 if (locations[i].lat == null || locations[i].lng == null) continue; latlng = LatLng( locations[i].lat, locations[i].lng, ); allMarkers.add( Marker( markerId: MarkerId(i.toString()), position: latlng, // 可选设置infoWindow方便点击查看车辆信息 infoWindow: InfoWindow(title: '司机: ${locations[i].driver}', snippet: '速度: ${locations[i].speed}km/h'), ), ); } // 通知界面刷新 setState(() {}); }
4. 排查地图本身配置问题
如果修改后页面仍然空白,先排查基础配置:
- 确认Google Map的API密钥已经正确配置到Android的
AndroidManifest.xml和iOS的Info.plist中 - 确认已经申请了网络权限、位置权限(如果需要显示当前定位)
- 确认地图的初始
CameraPosition设置合理,不要默认定位到经纬度为0的海洋区域,可以默认定位到第一个返回的车辆位置 - 可以先手动添加一个固定经纬度的Marker测试,比如北京坐标
LatLng(39.9042, 116.4074),如果这个Marker能显示,说明是你的接口数据/转换逻辑有问题,如果这个也不能显示,就是地图本身的配置问题
5. 额外排查点
- 打印
allMarkers的长度,确认是否有数据成功添加到列表中 - 检查接口返回的经纬度范围是否合法:纬度必须在[-90,90]之间,经度必须在[-180,180]之间,超出范围的经纬度不会显示
内容的提问来源于stack exchange,提问作者Umair Ahmad
相关产品推荐
相关产品推荐

