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
相关产品推荐
相关产品推荐

