已有网络连接检测代码,如何检测Wi-Fi/蜂窝网络是否连互联网?
检测网络是否接入互联网的实现方案
你当前的代码只能检测设备是否连接到Wi-Fi或移动网络,但无法确认这个网络是否真的能访问互联网。要实现互联网连通性检测,你可以通过发起一个轻量的HTTP请求来验证,下面是具体实现方法:
- 首先添加
http依赖到pubspec.yaml(如果还没添加):
dependencies: http: ^1.1.0
- 编写异步函数验证互联网连通性:
import 'package:http/http.dart' as http; Future<bool> hasInternetConnection() async { try { // 访问Google的无内容响应接口,轻量且适合检测连通性 final response = await http.get(Uri.parse('http://clients3.google.com/generate_204')); // 状态码204表示请求成功,说明能访问互联网 return response.statusCode == 204; } catch (e) { // 请求失败,说明无法访问互联网 return false; } }
- 整合到现有代码中,在检测到网络连接后验证互联网连通性:
final Connectivity connectivity = Connectivity(); bool isConnected = false; late final StreamSubscription connectivyStream; @override void initState() { super.initState(); connectivyStream = connectivity.onConnectivityChanged.listen((List<ConnectivityResult> results) { setState(() { isConnected = !results.contains(ConnectivityResult.none); }); if (isConnected) { // 验证互联网连通性 hasInternetConnection().then((hasInternet) { final snackBarContent = hasInternet ? '已接入互联网!' : '网络已连接但无法访问互联网!'; ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(snackBarContent, style: GoogleFonts.poppins(fontWeight: FontWeight.bold)), ), ); }); } else { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('未连接到任何网络!', style: GoogleFonts.poppins(fontWeight: FontWeight.bold)), ), ); } }); } @override void dispose() { connectivyStream.cancel(); super.dispose(); }
注意事项
- 确保Android项目的
AndroidManifest.xml中添加了INTERNET权限:
<uses-permission android:name="android.permission.INTERNET" />
- 若需要适配国内网络环境,可以替换检测地址为国内稳定的轻量接口(如
http://www.baidu.com,需调整响应判断逻辑) - 可以添加防抖逻辑,避免网络状态频繁变化时发起过多请求
内容的提问来源于stack exchange,提问作者laurent pierre konan
相关产品推荐
相关产品推荐

