Flutter获取网络状态
在app中我们需要获取到当前的网络状态并对用户进行一些相应的提示。使用Flutter Community的
connectivity_plus
包,很方便的获取到当前的网络状态。
首先我们需要添加包。
// 添加依赖项目 dependencies: connectivity_plus: ^1.0.6 // 终端中运行 flutter pub get // 引用包 import 'package:connectivity_plus/connectivity_plus.dart';
其次在项目中使用。通过 Connectivity 的 onConnectivityChanged 属性,调用 Stream 的 listen 方法并传递要在连接状态更改时调用的函数。该函数必须接受一个类型为 ConnectivityResult 的参数。在函数内部,处理连接状态发生变化时要执行的操作。确保您在不再使用时取消订阅,这可以在 dispose 方法中完成。
ConnectivityResult? _connectivityResult; late StreamSubscription _connectivitySubscription; @override initState() { super.initState(); _connectivitySubscription = Connectivity().onConnectivityChanged.listen(( ConnectivityResult result ) { print('Current connectivity status: $result'); _connectivityResult = result; }); } @override dispose() { super.dispose(); _connectivitySubscription.cancel(); }
获取当前的网络状态可以获取 Connectivity 的实例并调用其 checkConnectivity 方法。
ConnectivityResult? _connectivityResult; Future<void> _checkConnectivityState() async { final ConnectivityResult result = await Connectivity().checkConnectivity(); if (result == ConnectivityResult.wifi) { print('Connected to a Wi-Fi network'); } else if (result == ConnectivityResult.mobile) { print('Connected to a mobile network'); } else { print('Not connected to any network'); } setState(() { _connectivityResult = result; }); }
上述方法仅检查设备是否已连接到 Wi-Fi 或移动网络。它不会检查连接的网络是否可以访问 Internet。为了检查设备是否可以访问互联网,您可以尝试执行地址查找。在 Flutter 中,可以通过使用 dart:io 包来完成。它具有 InternetAddress.lookup 方法,可用于执行地址查找。因此,您需要通过传递有效且可访问的主机来调用该方法。如果结果不为空且不出错,则表示查找成功,设备已连接到互联网。
bool? _isConnectionSuccessful; Future<void> _tryConnection() async { try { final response = await InternetAddress.lookup('1'); setState(() { _isConnectionSuccessful = response.isNotEmpty; }); } on SocketException catch (e) { setState(() { _isConnectionSuccessful = false; }); } }
如果设备未连接到互联网,您将收到以下错误。如果给定的地址无效,您也会得到同样的错误。
SocketException: Failed host lookup: '1' (OS Error: No address associated with hostname, errno = 7)