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

