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

