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

Flutter中InternetAddress.lookup检测互联网连通性始终返回true问题

问题原因

  • InternetAddress.lookup仅执行DNS域名解析,不会真实校验公网连通性
  • 设备本地DNS缓存会返回历史解析结果,断网场景下也不会抛出异常
  • 未打通公网的内网、需要认证的公共WiFi等场景下,DNS请求会被劫持返回有效IP,导致误判

修复方案

将DNS校验替换为轻量HTTP HEAD请求校验,同时设置超时时间,准确验证公网连通性,优化后完整代码如下:

import 'dart:io';
import 'package:connectivity/connectivity.dart';

class ConnectionStatusSingleton {
  static Future<bool> checkConnection() async {
    var connectivityResult = await (Connectivity().checkConnectivity());
    // 先判断是否已接入蜂窝或WiFi网络
    if (connectivityResult != ConnectivityResult.mobile && connectivityResult != ConnectivityResult.wifi) {
      return false;
    }
    // 已接入网络,发起HTTP请求校验公网连通性
    try {
      final client = HttpClient();
      // 设置请求超时为3秒,避免长时间等待
      client.connectionTimeout = const Duration(seconds: 3);
      // 向可靠公网地址发起HEAD请求(仅请求响应头,流量消耗极低)
      final request = await client.headUrl(Uri.parse('https://www.example.com'));
      final response = await request.close();
      // 请求成功且状态码正常,说明公网可用
      return response.statusCode >= 200 && response.statusCode < 300;
    } catch (_) {
      // 任何异常都判定为公网不可用
      return false;
    }
  }
}

调用说明

原有调用方式无需改动:

bool connectionState = await ConnectionStatusSingleton.checkConnection();

额外优化提示

  • 如果是面向国内用户的应用,可以将请求地址替换为国内常用公网域名,响应速度更快
  • 可根据产品需求调整超时时间,建议设置在2-5秒区间
  • 注意Android/iOS端需要配置网络权限,否则会一直返回不可用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:06:00