flutter-geocoding抛出NOT_FOUND PlatformException无法捕获如何处理
异常说明
运行flutter-geocoding插件做反向地理编码时,会抛出如下未处理异常:Unhandled Exception: PlatformException(NOT_FOUND, No address information found for supplied coordinates (latitude: xxx, longitude: xxx)., null, null)
该异常属于原生平台层抛出的服务类异常,直接在普通代码块加try-catch未生效,通常是捕获范围未覆盖异步链路、未精准匹配异常类型导致。
正确处理步骤
- 精准覆盖异步调用链路做异常捕获
调用placemarkFromCoordinates方法时必须搭配await关键字,同时使用on PlatformException精准匹配平台异常类型,避免异常逃逸。参考实现:import 'package:flutter/services.dart'; import 'package:geocoding/geocoding.dart'; /// 安全调用反向地理编码,返回结构化地址列表 Future<List<Placemark>> parseAddressSafe(double lat, double lng) async { try { // 必须加await,否则异常会脱离当前try-catch的捕获范围 final placemarks = await placemarkFromCoordinates( lat, lng, localeIdentifier: 'zh_CN', ); return placemarks; } on PlatformException catch (e) { // 单独匹配NOT_FOUND错误码 if (e.code == 'NOT_FOUND') { print('坐标无对应地址数据,经纬度:$lat, $lng'); // 返回空列表作为缺省值,终止异常向上抛出 return []; } print('地理编码服务异常:${e.message}'); return []; } catch (e) { // 兜底捕获其余未知异常 print('地址解析未知错误:$e'); return []; } } - 前置校验过滤非法坐标
调用接口前先校验经纬度合法性,从源头减少无效请求:- 纬度合法区间为
-90.0 ~ 90.0 - 经度合法区间为
-180.0 ~ 180.0
经纬度超出区间、或为空值时直接拦截,无需发起地理编码请求。
- 纬度合法区间为
- 配置服务降级逻辑
地理编码依赖系统原生服务、后端接口能力,无法保证100%返回有效结果,遇到NOT_FOUND场景时不要让程序崩溃,可做如下降级:- 前端给用户展示「当前位置暂无详细地址」的友好提示
- 兜底展示经纬度文本,替代结构化地址信息
- 可配置1-2次重试,单次请求超时设置为3-5秒,避免无意义的频繁请求
- 增加全局异常兜底拦截
配置Flutter全局异常捕获机制,接住所有业务层漏处理的异常,避免程序崩溃:import 'dart:async'; import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; void main() { // 拦截框架层同步抛出的异常 FlutterError.onError = (details) { final err = details.exception; if (err is PlatformException && err.code == 'NOT_FOUND') { print('全局拦截地理编码无结果异常'); return; } // 其余异常走原有上报、展示逻辑 FlutterError.presentError(details); }; // 拦截异步域抛出的未处理异常 runZonedGuarded(() { runApp(const MyApp()); }, (error, stack) { if (error is PlatformException && error.code == 'NOT_FOUND') { print('全局异步域拦截地理编码无结果异常'); return; } // 其余异常走原有上报逻辑 print('未捕获异步异常:$error\n$stack'); }); }
内容的提问来源于stack exchange,提问作者MAlhamry
相关产品推荐
相关产品推荐

