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

Flutter加载API点位渲染OSM地图Marker报FormatException错误如何解决

问题定位

你遇到的FormatException: Unexpected end of input (at character 1)报错,本质是jsonDecode执行时传入了空字符串,结合你的代码可梳理出以下几个具体问题:

  • 你未对HTTP请求的响应状态码做判断,接口返回401、404、500等错误状态时,服务端可能返回空响应体,直接执行解码就会触发该报错。
  • 现有fromJson方法存在类型安全隐患:如果接口返回的经纬度是int类型,直接赋值给double类型的字段会抛出类型转换异常。
  • Marker生成逻辑存在两处bug:一是经纬度参数写错,e.stLat用了两次导致经度错误;二是冗余套了两层循环,外层forEach加内层map会重复生成Marker列表N次,完全无意义。
解决方案

1. 修复HTTP请求逻辑,增加状态校验和异常处理

Future<List<Stop>> fetchStops() async {
  String username = '';
  String password = '';
  String basicAuth = 'Basic ${base64Encode(utf8.encode('$username:$password'))}';
  final response = await http.get(
    Uri.parse(link),
    headers: <String, String>{'authorization': basicAuth},
  );
  // 先校验请求是否成功
  if (response.statusCode == 200) {
    // 打印响应内容排查接口返回格式是否正确
    print("接口返回内容:${response.body}");
    if (response.body.trim().isEmpty) {
      throw Exception("接口返回空数据");
    }
    var jsonResponse = convert.jsonDecode(response.body) as List;
    return jsonResponse.map((e) => Stop.fromJson(e)).toList();
  } else {
    throw Exception("请求失败,状态码:${response.statusCode},错误内容:${response.body}");
  }
}

2. 修复fromJson方法,增加类型兼容处理

factory Stop.fromJson(Map<String, dynamic> json) => Stop(
  // 统一转成double,同时给默认值避免空异常
  stLat: json["st_lat"]?.toDouble() ?? 0.0,
  stLong: json["st_long"]?.toDouble() ?? 0.0,
);

3. 修复Marker生成逻辑

if (snapshot.hasData) {
  listStops = snapshot.data;
  // 删掉外层多余的forEach,直接map生成列表即可
  allMarkers = listStops.map(
    (e) => Marker(
      width: 1,
      height: 1,
      // 第二个参数修正为stLong
      point: latLong.LatLng(e.stLat, e.stLong),
      builder: (_) => Icon(
        Icons.person_pin,
        color: Colors.green,
      )
    ),
  ).toList(growable: true);
}

额外优化建议

3000个Marker一次性渲染容易出现性能卡顿,可考虑开启Marker缓存,或者根据地图可视区域做点位的按需渲染。

内容的提问来源于stack exchange,提问作者user16357470

相关产品推荐
方舟 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