Flutter解析Google Directions API返回数据时触发类型不匹配异常
错误根因定位
日志提示的type 'String' is not a subtype of type 'int' of 'index'触发位置在assistantMethods.dart第63行的嵌套索引取值逻辑,核心问题有两点:
- 响应类型不匹配:
RequestAssistant.getRequest返回的res实际是原始字符串类型,并未经过JSON解码为Map结构。字符串类型的[]索引操作仅支持传入int参数(用于获取指定位置的字符),传入字符串类型的key"routes"时,就会直接触发类型不匹配异常。 - 缺少结构校验:即使完成JSON解码,Google Directions API在调用异常(密钥无效、路径不存在、配额耗尽)时会返回不含
routes字段的错误结构,无校验的嵌套取值依然会触发崩溃。
修复步骤
- 修正API响应解码逻辑
检查RequestAssistant.getRequest的实现,HTTP请求成功时,不要直接返回响应体字符串,引入dart:convert库将响应体解码为Map结构后再返回:import 'dart:convert'; // ...请求逻辑 if (response.statusCode == 200) { return jsonDecode(response.body) as Map<String, dynamic>; } - 增加取值前的结构合法性校验
替换原有无校验的嵌套取值逻辑,依次判断字段类型、存在性后再取值,避免非法结构触发异常:// 解码后先识别API层面的错误信息 if (res.containsKey("error_message")) { print("API调用失败: ${res["error_message"]}"); return null; } DirectionDetails directionDetails = DirectionDetails(); // 校验routes结构 final routes = res["routes"]; if (routes is! List || routes.isEmpty) { print("无有效路线返回: $res"); return null; } final firstRoute = routes[0] as Map<String, dynamic>; directionDetails.encodedPoints = firstRoute["overview_polyline"]?["points"] ?? ""; // 校验legs结构 final legs = firstRoute["legs"]; if (legs is! List || legs.isEmpty) { print("无有效行程段返回: $res"); return null; } final firstLeg = legs[0] as Map<String, dynamic>; directionDetails.distanceText = firstLeg["distance"]?["text"] ?? ""; directionDetails.distanceValue = firstLeg["distance"]?["value"] ?? 0; directionDetails.durationText = firstLeg["duration"]?["text"] ?? ""; directionDetails.durationValue = firstLeg["duration"]?["value"] ?? 0; return directionDetails; - 兼容空值场景
对所有嵌套字段使用?.空值判断,避免字段缺失时触发空指针异常。
内容的提问来源于stack exchange,提问作者Ahmad
相关产品推荐
相关产品推荐

