You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 02:15:04