You need to enable JavaScript to run this app. Flutter解析Google Directions API返回数据时触发类型不匹配异常
优惠活动
大模型
产品
解决方案
定价
更多

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字段的错误结构,无校验的嵌套取值依然会触发崩溃。
修复步骤
  1. 修正API响应解码逻辑
    检查RequestAssistant.getRequest的实现,HTTP请求成功时,不要直接返回响应体字符串,引入dart:convert库将响应体解码为Map结构后再返回:
    import 'dart:convert';
    
    // ...请求逻辑
    if (response.statusCode == 200) {
      return jsonDecode(response.body) as Map<String, dynamic>;
    }
    
  2. 增加取值前的结构合法性校验
    替换原有无校验的嵌套取值逻辑,依次判断字段类型、存在性后再取值,避免非法结构触发异常:
    // 解码后先识别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;
    
  3. 兼容空值场景
    对所有嵌套字段使用?.空值判断,避免字段缺失时触发空指针异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 23:57:02