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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 09:05:28