Flutter connectivity_plus在Android正常 iOS模拟器有网却提示无网络问题
解决方案
1. 修复代码逻辑缺陷
你的现有代码存在两处核心逻辑问题:
InternetConnectivity类仅监听了网络状态变更事件,未在初始化时主动查询当前网络状态,且成员变量haveInternet默认值为false- 页面
initState中实例化InternetConnectivity后,没有调用checkConnectivity()启动监听和状态查询,直接取值必然拿到默认的false
修复后的InternetConnectivity代码:
class InternetConnectivity with ChangeNotifier { StreamSubscription<ConnectivityResult>? _subscription; bool haveInternet = false; Future<void> checkConnectivity() async { if (_subscription == null) { // 先主动获取当前网络状态,避免首次启动无回调 final initialResult = await Connectivity().checkConnectivity(); _updateConnectivityStatus(initialResult); // 监听后续网络状态变化 _subscription = Connectivity().onConnectivityChanged.listen(_updateConnectivityStatus); } } void _updateConnectivityStatus(ConnectivityResult result) { bool res = result == ConnectivityResult.mobile || result == ConnectivityResult.wifi; setHaveInternet = res; } set setHaveInternet(bool value) { if (haveInternet != value) { haveInternet = value; notifyListeners(); } } // 页面销毁时调用取消订阅避免内存泄漏 void dispose() { _subscription?.cancel(); super.dispose(); } }
修复后的页面逻辑:
bool _haveInternet = true; InternetConnectivity? _internetConnectivity; @override void initState() { super.initState(); _internetConnectivity = InternetConnectivity(); // 启动网络状态监听 _internetConnectivity!.checkConnectivity(); // 监听网络状态变化自动更新UI _internetConnectivity!.addListener(() { setState(() { _haveInternet = _internetConnectivity!.haveInternet; }); }); } @override void dispose() { _internetConnectivity?.dispose(); super.dispose(); }
2. 检查iOS端配置
- 打开项目
ios/Runner/Info.plist,确认添加了网络访问权限配置:<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> - 进入iOS系统设置→无线局域网→使用WLAN与蜂窝网络的应用,找到你的应用,确认已经授予网络访问权限
- 如果你使用的
connectivity_plus版本低于2.3.0,建议升级到最新稳定版,旧版本存在iOS端网络状态识别异常的已知问题
3. 可选优化
connectivity_plus仅能判断设备是否接入了网络节点,无法判断该网络是否可以正常访问公网,如果需要更准确的连通性判断,可以额外增加一次对公网地址的轻量请求校验。
内容的提问来源于stack exchange,提问作者stacktrace2234
相关产品推荐
相关产品推荐

