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

Flutter iOS/Android应用互联网连接状态检测的最优方案问询

Flutter 真实联网状态检测的最佳实践(2023+)

首先明确:connectivity_plus只能检测设备是否接入了网络(WiFi/蜂窝),但无法验证是否真的能访问互联网——这也是官方文档明确说明的问题。目前主流的解决方案都是**「连接类型检测 + 真实网络验证」**的组合方式,以下是几种常用方案和项目中的实际做法:

一、基础组合方案:connectivity_plus + 轻量网络请求

这是最灵活、可控的方案,适合大部分项目:

  1. 用connectivity_plus监听设备的网络连接状态变化(比如从无网络切换到WiFi);
  2. 当检测到有连接时,发起一个轻量的HEAD请求到可靠的地址(优先用自己后端的健康检查接口,避免依赖公共地址被墙),通过请求是否成功来判断是否真的能上网。

代码示例

  1. 添加依赖:
dependencies:
  connectivity_plus: ^4.0.0
  http: ^1.1.0
  1. 封装工具类:
import 'dart:async';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:http/http.dart' as http;

class NetworkChecker {
  final Connectivity _connectivity = Connectivity();
  late StreamSubscription<ConnectivityResult> _connectivitySubscription;
  bool _hasInternet = false;

  // 初始化监听
  Future<void> init() async {
    _connectivitySubscription = _connectivity.onConnectivityChanged.listen((result) {
      // 网络状态变化时,延迟几百毫秒再检测,避免频繁切换
      Future.delayed(const Duration(milliseconds: 500), () => _checkInternetAccess());
    });
    // 初始检测
    await _checkInternetAccess();
  }

  // 检测真实联网状态
  Future<void> _checkInternetAccess() async {
    try {
      // 用HEAD请求,只获取响应头,更省流量
      final response = await http.head(
        Uri.parse('https://your-backend-domain.com/health'),
        timeout: const Duration(seconds: 3),
      );
      _hasInternet = response.statusCode == 200;
    } catch (_) {
      _hasInternet = false;
    }
  }

  // 获取当前真实联网状态
  bool get hasInternet => _hasInternet;

  // 取消监听
  void dispose() {
    _connectivitySubscription.cancel();
  }
}

二、专用插件:internet_connection_checker

这个插件封装了「连接检测 + 网络验证」的逻辑,内部会向多个可靠地址发起请求,适合不想自己写请求逻辑的场景:

  • 可以直接获取当前是否有互联网访问;
  • 支持监听联网状态变化。

代码示例

  1. 添加依赖:
dependencies:
  internet_connection_checker: ^1.0.0+1
  1. 使用方式:
import 'package:internet_connection_checker/internet_connection_checker.dart';

// 单次检测
bool hasInternet = await InternetConnectionChecker().hasConnection;

// 监听状态变化
StreamSubscription<InternetConnectionStatus> listener =
    InternetConnectionChecker().onStatusChange.listen((status) {
  switch (status) {
    case InternetConnectionStatus.connected:
      print('有互联网访问');
      break;
    case InternetConnectionStatus.disconnected:
      print('无互联网访问');
      break;
  }
});

三、项目中的实际做法

在生产环境中,我们通常会:

  • 优先用connectivity_plus做快速的UI状态切换(比如显示无网络提示);
  • 结合自己后端的健康接口做真实联网验证——这样不仅能检测互联网,还能同时确认后端服务是否可用;
  • 加入缓存逻辑:比如检测一次后,5分钟内不再重复检测,除非网络状态发生变化,减少不必要的请求;
  • 针对国内环境,避免使用Google等可能被墙的公共地址,改用国内的可靠地址或自有服务。

注意事项

  • 超时时间不要设置太长(3-5秒为宜),避免等待太久影响用户体验;
  • 处理所有异常:请求超时、DNS解析失败、连接重置等,都视为无互联网访问;
  • 不要在UI线程频繁发起检测,尽量放在异步逻辑中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:20:23