Flutter:如何检测应用是否真正联网(含Web端)
Flutter 应用联网检测方案(含Web端适配)
针对Web端InternetAddress.lookup不支持、http.get性能开销大的问题,推荐以下几种轻量方案:
1. 直接利用Web原生navigator.onLine API
这是性能最低的方案,无需任何网络请求,直接读取浏览器的联网状态判断:
import 'dart:js' as js; bool isWebOnline() { return js.context['navigator']['onLine'] as bool; }
- 优点:零性能开销,实时性强
- 局限性:仅判断浏览器是否处于"联网状态"(比如连上无网WiFi也会返回true),无法确保实际能访问互联网
2. 用HEAD请求检测实际联网能力
如果需要确认设备能真正访问互联网,用HEAD请求替代GET,只获取响应头,避免下载整个网页内容:
import 'package:http/http.dart' as http; Future<bool> hasRealInternetAccess() async { try { // 替换成你自己的轻量健康检查接口,或响应极小的公开资源接口 final response = await http.head(Uri.parse('https://your-server.com/health-check')); return response.statusCode >= 200 && response.statusCode < 300; } catch (_) { return false; } }
- 优点:能准确判断是否可访问目标网络,开销远低于
GET请求 - 注意:优先选择自己控制的接口,避免依赖第三方服务的稳定性
3. 跨平台库connectivity_plus
如果需要一套代码适配全平台(包括Web),可以用connectivity_plus库,Web端底层基于navigator.onLine实现:
import 'package:connectivity_plus/connectivity_plus.dart'; Future<bool> checkCrossPlatformConnectivity() async { final connectivityResult = await Connectivity().checkConnectivity(); return connectivityResult != ConnectivityResult.none; }
- 优点:跨平台兼容,无需针对Web单独写逻辑
- 局限性:同
navigator.onLine,仅判断连接状态,不保证实际联网能力,需结合HEAD请求补充验证
内容的提问来源于stack exchange,提问作者user19728436
相关产品推荐
相关产品推荐

