Flutter - 检查 Internet 连接示例
本教程为您提供了如何在 Flutter 中检查互联网连接的示例。
有时,您可能想要检查运行您的应用程序的设备的互联网连接。如果应用程序是使用 Flutter 开发的,您可以阅读本教程中的示例。
码字不易,点个赞,点亮再看,支持一下。
本实例flutter版本2.5.3,开启空安全
使用connectivity_plus
包
有一个来自 Flutter Community的connectivity_plus
包,可以轻松获取当前网络状态。首先,将其添加为pubspec.yaml
文件中的依赖项。
dependencies:
connectivity_plus: ^1.0.6
然后,运行flutter pub get
来安装包。
要使用该包,您需要在要使用它的文件上添加下面的语句。
代码语言:javascript复制 import 'package:connectivity_plus/connectivity_plus.dart';
获取 当前的连接状态
要获取当前的连接状态,您必须获取 Connectivity 的实例并调用其 checkConnectivity 方法。Connectivity 的构造函数已经返回了一个单例,所以你可以多次调用它,它会返回同一个实例。checkConnectivity 方法返回 ConnectivityResult 枚举,其值为:
wifi
:通过 Wi-Fi 连接的设备。mobile
:连接到蜂窝网络的设备。none
: 设备未连接到任何网络.
下面是一个检查当前连接状态的函数。
代码语言:javascript复制 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;
});
}
监听连接状态变化
该软件包还提供了一种侦听连接状态更改事件的简单方法。为此,您需要使用 Connectivity 的 onConnectivityChanged 属性,其类型为 Stream。然后,调用 Stream 的 listen 方法并传递要在连接状态更改时调用的函数。该函数必须接受一个类型为 ConnectivityResult 的参数。在函数内部,您可以处理连接状态发生变化时要执行的操作。确保您在不再使用时取消订阅,这可以在 dispose 方法中完成。
代码语言:javascript复制 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();
}
请记住,上述方法仅检查设备是否已连接到 Wi-Fi 或移动网络。它不会检查连接的网络是否可以访问 Internet。
使用 InternetAddress.lookup
为了检查设备是否可以访问互联网,您可以尝试执行地址查找。在 Flutter 中,可以通过使用 dart:io 包来完成。它具有 InternetAddress.lookup 方法,可用于执行地址查找。因此,您需要通过传递有效且可访问的主机来调用该方法。如果结果不为空且不出错,则表示查找成功,设备已连接到互联网
代码语言:javascript复制 bool? _isConnectionSuccessful;
Future<void> _tryConnection() async {
try {
final response = await InternetAddress.lookup('1');
setState(() {
_isConnectionSuccessful = response.isNotEmpty;
});
} on SocketException catch (e) {
setState(() {
_isConnectionSuccessful = false;
});
}
}
如果设备未连接到互联网,您将收到以下错误。如果给定的地址无效,您也会得到同样的错误。
代码语言:javascript复制SocketException: Failed host lookup: '1' (OS Error: No address associated with hostname, errno = 7)
完整代码
代码语言:javascript复制import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:connectivity_plus/connectivity_plus.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: '坚果前端',
home: ConnectivityStatusExample(),
);
}
}
extension ParseToString on ConnectivityResult {
String toValue() {
return this.toString().split('.').last;
}
}
class ConnectivityStatusExample extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _ConnectivityStatusExampleState();
}
}
class _ConnectivityStatusExampleState extends State<ConnectivityStatusExample> {
static const TextStyle textStyle = const TextStyle(
fontSize: 16,
);
ConnectivityResult? _connectivityResult;
late StreamSubscription _connectivitySubscription;
bool? _isConnectionSuccessful;
@override
initState() {
super.initState();
_connectivitySubscription = Connectivity()
.onConnectivityChanged
.listen((ConnectivityResult result) {
print('Current connectivity status: $result');
setState(() {
_connectivityResult = result;
});
});
}
@override
dispose() {
super.dispose();
_connectivitySubscription.cancel();
}
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;
});
}
Future<void> _tryConnection() async {
try {
final response = await InternetAddress.lookup('www.baidu.com');
setState(() {
_isConnectionSuccessful = response.isNotEmpty;
});
} on SocketException catch (e) {
print(e);
setState(() {
_isConnectionSuccessful = false;
});
}
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: AppBar(
title: const Text('公众号:坚果前端'),
centerTitle: true,
backgroundColor: Colors.teal,
),
body: SizedBox(
width: double.infinity,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Connection status: ${_connectivityResult?.toValue()}',
style: textStyle,
),
Text(
'Is connection success: $_isConnectionSuccessful',
style: textStyle,
),
OutlinedButton(
child: const Text('Check internet connection'),
onPressed: () => _checkConnectivityState(),
),
OutlinedButton(
child: const Text('Try connection'),
onPressed: () => _tryConnection(),
),
],
),
),
);
}
}
概括
这就是如何使用 Flutter 检查设备的互联网连接。要检查设备是否已连接到 Wi-Fi 或移动网络,您可以使用该connectivity_plus
包,它具有检查当前连接状态和监听连接状态变化的功能。如果您想检查设备是否可以访问互联网,您可以执行地址查找。