Flutter使用Google Maps报ZERO_RESULTS及NoSuchMethodError错误咨询
问题根因
两个报错属于因果关联的连锁问题:
- 接口返回
{geocoded_waypoints: [{}, {}], routes: [], status: ZERO_RESULTS}是Google Maps路线/地理编码接口的正常业务响应,代表当前请求传入的起终点地址/坐标无法生成可通行路线,接口未返回有效路线数据。 - Flutter抛出的
NoSuchMethodError: The method '[]' was called on null属于代码逻辑漏洞:没有对接口返回状态做前置判断,也没有做空安全校验,直接在null对象上调用[]操作符读取字段(常见场景是直接读取空的routes数组的第一个元素,或者链式读取路线下的分段、折线字段时上游对象为null)。
修复方案
- 先处理
ZERO_RESULTS业务异常- 校验请求参数合法性:检查传入的经纬度是否写反顺序、地址文本是否存在拼写错误、点位是否落在无道路覆盖的区域(比如海域、管制禁区)、起终点是否跨了不支持通行的区域
- 接口响应后第一时间校验
status字段,只有status == 'OK'时才进入路线数据解析流程;遇到ZERO_RESULTS等非OK状态,直接给用户展示“所选位置无法规划路线,请调整后重试”的提示,终止后续解析逻辑
- 补全全链路空安全校验
- 禁止无判空的链式字段读取,比如不要直接写
response['routes'][0]['legs'][0]这类代码,每一层取值前先判断对象是否为null、数组/列表是否非空,参考示例:// 假设directionsResult是接口返回的json解析后的Map if (directionsResult['status'] == 'OK') { final routes = directionsResult['routes'] as List?; if (routes != null && routes.isNotEmpty) { final firstRoute = routes.first as Map?; if (firstRoute != null) { // 在这里继续解析路线的折线、分段等信息,每一层都先判空再取值 } } } else { // 处理错误场景,打印日志、提示用户 }
- 禁止无判空的链式字段读取,比如不要直接写
- 额外排查项:检查Google Maps API密钥对应的服务是否已在云控制台开通(比如路线规划、地理编码接口权限)、密钥的应用限制(包名、SHA1)是否配置正确、账号是否存在欠费,权限不足时也可能返回空响应触发同类报错。
内容的提问来源于stack exchange,提问作者Mazen Tarek Sliem
相关产品推荐
相关产品推荐

