You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 09:36:03