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

