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

Flutter如何检测设备活跃网络连接而非仅判断网络开关状态

检测真实活跃网络连接的方案

connectivity_plus 确实只能判断设备的网络接口是否开启,无法验证是否真的能访问互联网。要检测真实的活跃连接,你需要在网络状态变更时,发起一个实际的网络请求来确认连通性。

以下是改进后的代码实现:

1. 添加依赖

确保你的pubspec.yaml里包含必要的包:

dependencies:
  flutter:
    sdk: flutter
  connectivity_plus: ^6.0.0
  http: ^1.1.0

2. 改进ConnectivityProvider

import 'dart:async';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http;

class ConnectivityProvider with ChangeNotifier {
  late bool _isOnline = false;
  bool get isOnline => _isOnline;

  // 防抖定时器,避免频繁触发网络请求
  Timer? _debounceTimer;

  ConnectivityProvider() {
    final Connectivity _connectivity = Connectivity();
    // 初始化时先检查一次网络状态
    _checkConnectivity();
    // 监听网络状态变化
    _connectivity.onConnectivityChanged.listen((_) {
      // 防抖:300ms内多次触发只执行最后一次
      _debounceTimer?.cancel();
      _debounceTimer = Timer(const Duration(milliseconds: 300), () {
        _checkConnectivity();
      });
    });
  }

  // 检查真实网络连通性
  Future<void> _checkConnectivity() async {
    final connectivityResult = await Connectivity().checkConnectivity();
    if (connectivityResult == ConnectivityResult.none) {
      _updateOnlineStatus(false);
      return;
    }

    // 尝试访问一个可靠的公共地址来验证连通性
    try {
      // 可替换为自己的服务器健康检查接口,降低第三方依赖
      final response = await http.get(Uri.parse('https://www.baidu.com'))
          .timeout(const Duration(seconds: 5));
      // 只要能收到有效响应,就判定网络可用
      _updateOnlineStatus(response.statusCode >= 200 && response.statusCode < 500);
    } catch (e) {
      // 超时或请求失败,判定为无网络
      _updateOnlineStatus(false);
    }
  }

  void _updateOnlineStatus(bool status) {
    if (_isOnline != status) {
      _isOnline = status;
      notifyListeners();
    }
  }

  @override
  void dispose() {
    _debounceTimer?.cancel();
    super.dispose();
  }
}

关键说明:

  • 防抖处理:避免网络状态频繁切换时(比如Wi-Fi信号不稳定)发起大量网络请求,设置300ms延迟,只处理最后一次状态变更。
  • 真实连通性验证:通过http包发起GET请求,访问稳定的公共地址或内部健康检查接口,能在超时时间内收到响应则判定为有活跃网络。
  • 超时设置:给请求加上5秒超时,避免因网络过慢导致长时间等待。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:40:34