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

Flutter应用中如何判断已连接WiFi是否具备互联网访问能力

Flutter判断已连接WiFi是否具备互联网访问能力的实现方案

connectivity 库的ConnectivityResult.wifi仅能判断设备是否接入了WiFi热点,无法验证该热点是否具备互联网访问能力,这是问题的核心原因。你可以通过轻量网络探活的方式验证实际连通性,具体实现如下:

方案1:基础探活方法实现

基于Dart自带的HttpClient发起轻量请求,访问高可用公共地址判断连通性,无需引入额外依赖:

Future<bool> hasInternetAccess() async {
  try {
    final HttpClient client = HttpClient();
    // 选择公共DNS服务的http地址作为探活目标,请求开销极低
    final request = await client.getUrl(Uri.parse('http://1.1.1.1'));
    // 设置超时时间避免弱网下长时间等待
    request.timeout = const Duration(seconds: 3);
    final response = await request.close();
    return response.statusCode == 200;
  } catch (_) {
    // 出现任何异常(超时、无路由、连接失败等)均判定为无互联网访问能力
    return false;
  }
}

方案2:结合connectivity库的业务封装

如果需要和WiFi连接判断结合使用,可直接封装为专用方法,符合你的原有业务逻辑:

import 'package:connectivity/connectivity.dart';

Future<bool> isConnectedWifiHasInternet() async {
  // 第一步:先判断当前是否连接到WiFi网络
  final ConnectivityResult connectivityResult = await Connectivity().checkConnectivity();
  if (connectivityResult != ConnectivityResult.wifi) {
    return false;
  }
  // 第二步:验证当前网络是否具备互联网访问能力
  return await hasInternetAccess();
}

注意事项

  • 不要在UI线程频繁调用探活方法,建议仅在执行依赖网络的业务操作前调用,或在connectivity的网络状态变化回调中触发检测,减少不必要的性能开销
  • 如果你的应用有自研服务端,优先探活自身服务端的健康检查接口,避免出现公网正常但服务端故障导致的业务异常,更贴合实际业务需求
  • 安卓平台需要提前申请网络相关权限,在android/app/src/main/AndroidManifest.xml中添加对应权限声明:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  • 探活地址优先选择http协议的高可用公共服务地址,避免https证书校验、域名解析问题导致的误判,可设置2-3个备选探活地址降低误判概率

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:18:00