Flutter应用网络连接检测异常:需登录WiFi下检测结果始终为True
问题原因分析
你遇到的问题核心是当前WiFi虽然需要登录,但设备仍能和路由建立连接,且DNS解析、TCP连接能正常完成,导致两种检测方法误判:
InternetAddress.lookup仅完成DNS解析,只要域名能解析到IP就返回成功,完全不检测是否能访问目标内容。internet_connection_checker默认逻辑是只要能和检测地址建立TCP连接或收到HTTP响应(哪怕是3xx重定向到登录页),就判定为有网络。而这类需要登录的WiFi会对所有请求做重定向,插件收到重定向响应后就返回true。
解决方案
方案1:自定义HTTP请求检测
直接请求一个可靠的公开接口,通过HTTP状态码判断是否能正常访问网络(重定向会返回3xx状态码,正常访问返回200):
import 'package:http/http.dart' as http; Future<bool> hasValidInternet() async { try { // 请求example.com,设置5秒超时避免等待过久 final response = await http.get(Uri.parse('https://example.com')) .timeout(const Duration(seconds: 5)); // 仅当状态码为200时,判定为有效网络 return response.statusCode == 200; } catch (_) { // 超时、连接失败等情况都判定为无有效网络 return false; } }
注意:需要在pubspec.yaml中添加http依赖。
方案2:修改internet_connection_checker的检测逻辑
自定义插件的检测规则,要求响应状态码必须为200:
import 'package:internet_connection_checker/internet_connection_checker.dart'; Future<bool> hasValidInternet() async { final checker = InternetConnectionChecker() ..addAddress( AddressCheckOptions( uri: Uri.parse('https://example.com'), // 自定义响应状态判断逻辑:仅200为成功 responseStatus: (statusCode) => statusCode == 200, ), ); return await checker.hasConnection; }
你也可以添加多个检测地址,提升可靠性。
额外注意事项
- 建议设置合理的超时时间,避免检测过程阻塞UI;
- 可以选择多个稳定的检测地址(比如同时检测example.com、google.com),避免单个地址故障导致误判;
- 确保应用已申请网络权限:Android需在
AndroidManifest.xml中添加<uses-permission android:name="android.permission.INTERNET"/>,iOS需在Info.plist中配置网络权限。
内容的提问来源于stack exchange,提问作者pnw
相关产品推荐
相关产品推荐

