Dart无法访问API返回JSON字段并添加至Google Maps Marker
问题排查与解决方案
1. 先确认API响应的JSON结构
先打印完整解析后的数据,验证records数组是否存在,以及fields内的字段名是否和你代码中使用的完全一致:
final response = await http.get(Uri.parse('你的API地址')); final data = jsonDecode(response.body); print('完整响应数据: $data'); // 查看records数组层级、fields内字段名是否正确
常见问题:字段名拼写错误(比如把postal_code写成postalCode)、records嵌套层级不对(比如需要data['results']['records']而非直接data['records'])、API返回的records本身为空数组。
2. 修正遍历与Marker创建逻辑
确保正确遍历records数组,并安全访问目标字段:
Set<Marker> markers = {}; // 先校验records的合法性 if (data.containsKey('records') && data['records'] is List) { List records = data['records']; for (var record in records) { // 校验当前record的fields及目标字段是否存在 if (record.containsKey('fields') && record['fields'].containsKey('postal_code') && record['fields'].containsKey('latitude') && record['fields'].containsKey('longitude')) { String postalCode = record['fields']['postal_code']; // 处理经纬度的类型转换,避免API返回字符串类型导致报错 double lat = double.parse(record['fields']['latitude'].toString()); double lon = double.parse(record['fields']['longitude'].toString()); print('邮编: $postalCode, 纬度: $lat, 经度: $lon'); // 验证字段值是否正确 Marker marker = Marker( markerId: MarkerId(postalCode), position: LatLng(lat, lon), infoWindow: InfoWindow(title: postalCode), ); markers.add(marker); print('当前Marker数量: ${markers.length}'); // 观察数量是否正常增长 } else { print('当前record缺少必要字段: $record'); } } } else { print('响应中不存在合法的records数组'); }
3. 检查getCountry方法的问题
如果getCountry是你封装的方法,重点排查:
- 方法内部是否正确处理异步逻辑(API调用需加
await,否则会提前执行后续代码) - 方法内的JSON解析路径是否和实际响应匹配
- 是否在方法内重新创建了Marker集合,导致外部引用的集合始终为空
4. 类型转换注意事项
部分API返回的经纬度可能是字符串类型,直接强转double会报错,建议先转字符串再解析;如果API返回数字类型,可直接强转:
// 数字类型直接强转 double lat = record['fields']['latitude'] as double;
内容的提问来源于stack exchange,提问作者CODERjack
相关产品推荐
相关产品推荐

