Flutter geocoding调用placemarkFromCoordinates报主线程网络异常问题
报错触发原因
核心报错为android.os.NetworkOnMainThreadException,是安卓系统原生的线程保护机制触发:安卓默认禁止在UI主线程执行网络请求类耗时操作,违规会直接抛出该异常。
你使用的geocoding: ^2.0.4版本存在安卓端原生实现缺陷:插件调用安卓系统Geocoder.getFromLocation地理编码网络接口时,没有将逻辑切换到子线程执行,直接在Flutter与原生通信的主线程回调中运行网络请求,刚好触发系统线程检查。安卓模拟器默认开启严格的线程检查规则,因此该问题会稳定复现,部分真机可能因厂商放宽检查规则暂时不报错,但依然存在主线程耗时导致UI卡顿的隐患。
可行解决方案
- 优先升级依赖版本
该主线程执行网络请求的bug已经在geocoding后续官方版本中修复,无需修改现有业务调用代码,直接将pubspec.yaml中的依赖版本升级到修复后的稳定版本即可:
修改完成后在项目根目录执行dependencies: geocoding: ^2.1.0flutter pub get拉取最新依赖,重新编译运行应用即可解决问题。 - 临时调试规避方案(不推荐生产环境使用)
如果暂时无法升级依赖,可以通过修改安卓原生配置临时绕过系统线程检查,找到安卓项目下的MainActivity文件,路径一般为android/app/src/main/kotlin/[对应项目包名]/MainActivity.kt,在onCreate方法中添加如下代码:
该方案只是关闭了系统的线程检查,本质还是在主线程执行网络请求,可能引发UI掉帧、ANR问题,仅适合临时调试使用。override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val policy = StrictMode.ThreadPolicy.Builder().permitAll().build() StrictMode.setThreadPolicy(policy) } - 模拟器环境额外排查项
部分安卓镜像内置的定位服务未集成地理编码能力,修复线程问题后如果依然无法获取地址,需要确认模拟器已正常连接网络、应用已拿到定位权限,必要时可以换用真机测试验证逻辑。
内容的提问来源于stack exchange,提问作者Janaka
相关产品推荐
相关产品推荐

