Flutter网络连接检测插件data_connection_checker的使用

Flutter网络连接检测插件data_connection_checker的使用

Pub

一个纯Dart工具库,通过打开到指定地址的套接字来检查互联网连接。提供了一些方便的默认值。

注意,该插件仍在测试阶段,可能会有一些问题。欢迎反馈。

目录

描述

通过打开到一系列地址的套接字来检查互联网连接。

该插件的默认值应该足以可靠地确定设备是否连接到全球网络,即是否有访问互联网的能力。

注意:你不应该根据当前网络状态决定是否可以可靠地进行网络连接。你的应用程序代码应始终防护来自网络层的超时和错误。

快速开始

DataConnectionChecker() 实际上是一个单例。调用 DataConnectionChecker() 总是会返回相同的实例。

你可以为 DataConnectionChecker().addresses 提供一个新的列表,如果你需要检查不同的目标、端口和超时时间。每个地址也可以有自己的端口和超时时间。更多详情请参见文档中的 InternetAddressCheckOptions

首先你需要安装它(这是推荐的方式):

然后你就可以开始使用这个库了:

bool result = await DataConnectionChecker().hasConnection;
if(result == true) {
  print('YAY! Free cute dog pics!');
} else {
  print('No internet :( Reason:');
  print(DataConnectionChecker().lastTryResults);
}

目的

这个包存在的原因是 connectivity 包无法可靠地确定数据连接是否可用。更多信息可以在其页面查看:https://pub.dev/packages/connectivity

你可以在以下方式中结合使用 connectivity 包:

var isDeviceConnected = false;

var subscription = Connectivity().onConnectivityChanged.listen((ConnectivityResult result) async {
  if(result != ConnectivityResult.none) {
    isDeviceConnected = await DataConnectionChecker().hasConnection;
  }
});

注意:记得在不再需要时取消 subscription。更多信息请参阅 connectivity 包的文档。

它是如何工作的

所有地址同时被ping。如果套接字连接到地址/端口成功,则将 true 布尔值推送到列表;如果失败(通常是因为超时,默认为10秒),则将 false 布尔值推送到同一个列表。

当所有请求都以成功或失败完成时,会检查列表是否包含至少一个 true 布尔值。如果有,那么外部地址是可用的,所以有数据连接。如果列表中的所有值都是 false,那么我们就无法访问外面的世界,因此 hasConnection 也返回 false

这将在所有地址上同时发生,因此最大等待时间是超时时间最长的地址。

我认为这是一种可靠且快速的方法来检查设备是否有一个可用的数据连接,但我也可能是错的。如果你有更好的方法,请在GitHub仓库页面上提出问题。

默认值

这些默认值基于从 https://perfops.net/https://www.dnsperf.com/#!dns-resolvers 收集的数据。

默认地址

包括前三个全球可用的免费DNS解析器。

地址 提供商 信息
1.1.1.1 CloudFlare https://1.1.1.1
1.0.0.1 CloudFlare https://1.1.1.1
8.8.8.8 Google https://developers.google.com/speed/public-dns/
8.8.4.4 Google https://developers.google.com/speed/public-dns/
208.67.222.222 OpenDNS https://use.opendns.com/
208.67.220.220 OpenDNS https://use.opendns.com/
static final List<AddressCheckOptions> DEFAULT_ADDRESSES = List.unmodifiable([
  AddressCheckOptions(
    InternetAddress('1.1.1.1'),
    port: DEFAULT_PORT,
    timeout: DEFAULT_TIMEOUT,
  ),
  AddressCheckOptions(
    InternetAddress('8.8.4.4'),
    port: DEFAULT_PORT,
    timeout: DEFAULT_TIMEOUT,
  ),
  AddressCheckOptions(
    InternetAddress('208.67.222.222'),
    port: DEFAULT_PORT,
    timeout: DEFAULT_TIMEOUT,
  ),
]);

默认端口

… 是53。

DNS服务器在端口53(UDP和TCP)上监听请求。因此,所有DNS请求都发送到端口53。

更多信息:

static const int DEFAULT_PORT = 53;

默认超时时间

… 是10秒。

static const Duration DEFAULT_TIMEOUT = Duration(seconds: 10);

默认间隔时间

… 是10秒。间隔是自动检查之间的时间。自动检查会在附加了 onStatusChange 监听器后开始,因此请记住取消不必要的订阅。

checkInterval(控制检查频率)默认为此值。如果你需要更频繁地执行检查,或者有其他需求,可以更改它。

static const Duration DEFAULT_INTERVAL = const Duration(seconds: 10);
...
Duration checkInterval = DEFAULT_INTERVAL;

使用方法

示例:

import 'package:data_connection_checker/data_connection_checker.dart';

main() async {
  // 简单检查是否有互联网连接
  print("The statement 'this machine is connected to the Internet' is: ");
  print(await DataConnectionChecker().hasConnection);
  // 返回一个布尔值

  // 我们也可以获取一个枚举值而不是布尔值
  print("Current status: ${await DataConnectionChecker().connectionStatus}");
  // 打印 DataConnectionStatus.connected 或 DataConnectionStatus.disconnected

  // 这将返回最后一次调用 hasConnection 或 connectionStatus 的结果
  print("Last results: ${DataConnectionChecker().lastTryResults}");

  // 主动监听状态更新
  // 这将导致 DataConnectionChecker 周期性地检查
  // 频率由 DataConnectionChecker().checkInterval 控制
  // 直到 listener.cancel() 被调用
  var listener = DataConnectionChecker().onStatusChange.listen((status) {
    switch (status) {
      case DataConnectionStatus.connected:
        print('Data connection is available.');
        break;
      case DataConnectionStatus.disconnected:
        print('You are disconnected from the internet.');
        break;
    }
  });

  // 30秒后关闭监听器,以便程序不会永远运行
  await Future.delayed(Duration(seconds: 30));
  await listener.cancel();
}

注意:记得在不再需要时释放任何监听器,以防止内存泄漏,例如在 StatefulWidgetdispose() 方法中:

...
[@override](/user/override)
void dispose() {
  listener.cancel();
  super.dispose();
}
...

更多关于Flutter网络连接检测插件data_connection_checker的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络连接检测插件data_connection_checker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


data_connection_checker 是一个用于检测设备网络连接状态的 Flutter 插件。它可以帮助你检查设备是否连接到互联网,以及连接的类型(如 WiFi 或移动数据)。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 data_connection_checker 依赖:

dependencies:
  flutter:
    sdk: flutter
  data_connection_checker: ^0.3.4

然后运行 flutter pub get 来安装依赖。

2. 导入包

在你的 Dart 文件中导入 data_connection_checker 包:

import 'package:data_connection_checker/data_connection_checker.dart';

3. 检查网络连接

你可以使用 DataConnectionChecker 类来检查设备的网络连接状态。

3.1 检查是否有网络连接

bool result = await DataConnectionChecker().hasConnection;
if (result == true) {
  print("设备已连接到互联网");
} else {
  print("设备未连接到互联网");
}

3.2 获取连接状态信息

你可以使用 DataConnectionChecker().connectionStatus 来获取更详细的连接状态信息。

DataConnectionStatus status = await DataConnectionChecker().connectionStatus;
if (status == DataConnectionStatus.connected) {
  print("设备已连接到互联网");
} else {
  print("设备未连接到互联网");
}

3.3 监听网络连接状态的变化

你还可以监听网络连接状态的变化:

DataConnectionChecker().onStatusChange.listen((DataConnectionStatus status) {
  switch (status) {
    case DataConnectionStatus.connected:
      print("设备已连接到互联网");
      break;
    case DataConnectionStatus.disconnected:
      print("设备未连接到互联网");
      break;
  }
});

4. 示例代码

以下是一个完整的示例,展示如何使用 data_connection_checker 来检测和监听网络连接状态:

import 'package:flutter/material.dart';
import 'package:data_connection_checker/data_connection_checker.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Network Connection Checker',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: NetworkCheckPage(),
    );
  }
}

class NetworkCheckPage extends StatefulWidget {
  @override
  _NetworkCheckPageState createState() => _NetworkCheckPageState();
}

class _NetworkCheckPageState extends State<NetworkCheckPage> {
  bool _isConnected = false;
  String _connectionStatus = 'Unknown';

  @override
  void initState() {
    super.initState();
    _checkConnection();
    _listenForConnectionChange();
  }

  Future<void> _checkConnection() async {
    bool result = await DataConnectionChecker().hasConnection;
    setState(() {
      _isConnected = result;
      _connectionStatus = result ? 'Connected' : 'Disconnected';
    });
  }

  void _listenForConnectionChange() {
    DataConnectionChecker().onStatusChange.listen((DataConnectionStatus status) {
      setState(() {
        _isConnected = status == DataConnectionStatus.connected;
        _connectionStatus = status == DataConnectionStatus.connected ? 'Connected' : 'Disconnected';
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Network Connection Checker'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Connection Status:',
              style: TextStyle(fontSize: 20),
            ),
            Text(
              _connectionStatus,
              style: TextStyle(fontSize: 30, fontWeight: FontWeight.bold, color: _isConnected ? Colors.green : Colors.red),
            ),
          ],
        ),
      ),
    );
  }
}

5. 注意事项

  • data_connection_checker 插件通过向特定的 URL(如 google.com)发送请求来检测网络连接。因此,它需要设备能够访问互联网。
  • 由于该插件依赖于网络请求,因此在某些情况下可能会有延迟。
  • 该插件已被标记为弃用,建议使用 internet_connection_checker 插件作为替代。

6. 替代方案:internet_connection_checker

如果你正在寻找一个更现代的替代方案,可以使用 internet_connection_checker 插件。它的使用方法与 data_connection_checker 类似,但提供了更多的功能和更好的支持。

dependencies:
  flutter:
    sdk: flutter
  internet_connection_checker: ^0.0.9+3
import 'package:internet_connection_checker/internet_connection_checker.dart';

bool result = await InternetConnectionChecker().hasConnection;
if (result) {
  print("设备已连接到互联网");
} else {
  print("设备未连接到互联网");
}
回到顶部