Flutter调用network_info_plus的getLocationServiceAuthorization报MissingPluginException如何解决
异常触发原因
- 最常见的原因是添加
network_info_plus依赖后仅执行了热重载/热更新,没有重新完整编译应用,插件的原生端代码没有被打包进应用包,导致方法通道找不到对应的实现。 network_info_plus版本和当前项目的Flutter版本不兼容,高版本的network_info_plus移除了对低版本Flutter的适配,部分方法的原生实现无法被调用。- 应用运行在
network_info_plus不支持的平台上:getLocationServiceAuthorization方法仅支持Android、iOS平台,在桌面、Web等平台运行时会抛出该异常。
修复方案
- 先执行通用修复流程:停止当前运行的应用,依次执行
flutter clean、flutter pub get命令,之后重新完整编译运行项目,不要使用热重载/热更新,90%的同类异常可以通过该方案解决。 - 检查版本适配:如果你的项目Flutter版本低于2.10,将
network_info_plus依赖降级到3.x版本;如果是更高版本的Flutter,升级到network_info_plus的最新稳定版即可。 - 增加平台判断逻辑,仅在Android、iOS平台调用SSID获取相关方法,其他平台可以直接跳过SSID校验逻辑。
额外代码逻辑优化建议
你调整后的代码存在明显的异步逻辑问题:NetworkInfo类的构造函数调用了异步方法_initNetworkInfo,但构造函数无法等待异步任务执行完成,你直接访问NetworkInfo().wifiName时,异步任务还没执行完,拿到的永远是null,永远无法匹配到目标SSID。
建议调整为异步判断逻辑,参考代码如下:
// 将状态判断方法改为异步 Future<ConnectivityStatus> _getStatusFromResult(ConnectivityResult result) async { switch (result) { case ConnectivityResult.mobile: case ConnectivityResult.none: return ConnectivityStatus.NotConnected; case ConnectivityResult.wifi: final wifiName = await _initNetworkInfo(); return wifiName == 'WIFI_SSID_NAME' ? ConnectivityStatus.Connected : ConnectivityStatus.NotConnected; default: return ConnectivityStatus.NotConnected; } }
同时要正常获取SSID还需要补充平台权限配置:
- Android端:在
AndroidManifest.xml中添加ACCESS_FINE_LOCATION、ACCESS_WIFI_STATE、ACCESS_NETWORK_STATE权限,Android 12及以上还需要添加ACCESS_COARSE_LOCATION、NEARBY_WIFI_DEVICES权限。 - iOS端:在
Info.plist中添加NSLocationWhenInUseUsageDescription权限说明,开启Access WiFi Information能力。
内容的提问来源于stack exchange,提问作者lnk3
相关产品推荐
相关产品推荐

