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

发布于 1周前 作者 h691938207 来自 Flutter

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

描述

data_connection_checker_nulls 是一个纯 Dart 实用库,通过打开到指定地址列表的套接字来检查互联网连接。默认情况下,它提供了方便的配置,可以可靠地确定设备是否当前连接到全球网络(即是否有访问互联网的能力)。

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

快速开始

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

你可以通过 DataConnectionChecker().addresses 提供一个新的地址列表,如果需要检查不同的目标、端口和超时时间。每个地址都可以有自己的端口和超时时间。有关更多信息,请参阅 InternetAddressCheckOptions 的文档。

安装

首先,你需要安装这个插件。这是推荐的方式:

dependencies:
  data_connection_checker_nulls: ^1.0.0

然后,你可以在项目中开始使用这个库:

import 'package:data_connection_checker_nulls/data_connection_checker_nulls.dart';

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

目的

这个包存在的原因是 connectivity 包不能可靠地确定数据连接是否实际可用。更多关于 connectivity 包的信息,请参阅其页面:connectivity

更多关于这个问题的一般信息:

你可以将这个包与 connectivity 结合使用:

var isDeviceConnected = false;

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

// 记得在不再需要时取消订阅,以防止内存泄漏

工作原理

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

当所有请求都完成时(无论是成功还是失败),会检查列表中是否至少有一个 true 布尔值。如果有,则表示外部地址可用,因此我们有数据连接。如果列表中的所有值都是 false,则表示没有连接到外部世界,hasConnection 也会返回 false

这一切同时发生,所以最大等待时间是具有最高指定超时时间的地址,如果它不可达的话。

我认为这是一个 可靠快速 的方法来检查设备是否有数据连接,但我也可能是错的。如果你有更好的方法,建议你在 Github 仓库页面上打开一个 issue。

默认值

默认值基于从 perfops.netdnsperf.com 收集的数据。

DEFAULT_ADDRESSES

包括全球前 3 个免费的 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,
  ),
]);

DEFAULT_PORT

… 是 53。

DNS 服务器监听 53 端口(UDP 和 TCP)。所以所有 DNS 请求都发送到 53 端口 …

更多信息:

static const int DEFAULT_PORT = 53;

DEFAULT_TIMEOUT

… 是 10 秒。

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

DEFAULT_INTERVAL

… 是 10 秒。间隔是自动检查之间的时间。如果 onStatusChange 有监听器,自动检查就会开始,因此记得取消不必要的订阅。

checkInterval(控制检查频率)默认为此值。如果你需要更频繁或更少频繁地进行检查,可以更改它。

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

使用

示例

import 'package:data_connection_checker_nulls/data_connection_checker_nulls.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}");

  // 主动监听状态更新
  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
void dispose() {
  listener.cancel();
  super.dispose();
}
...

更多示例请参阅 example 文件夹。

许可证

MIT

版权所有 2019 Kristiyan Mitev 和 Spirit Navigator

特此授予,免费获得本软件及其相关文档文件(以下简称“软件”)的任何人,以不受限制地处理本软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售本软件的副本,并允许向其提供软件的人这样做,前提是遵守以下条件:

上述版权声明和本许可声明应包含在本软件的所有副本或实质部分中。

本软件按“原样”提供,不附带任何明示或暗示的保证,包括但不限于对适销性、特定用途适用性和非侵权性的保证。在任何情况下,作者或版权持有人都不对因使用或交易本软件而产生的任何索赔、损害或其他责任负责。

特性和错误

请在 问题跟踪器 中提交功能请求和错误报告。


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

1 回复

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


当然,以下是如何在Flutter项目中使用data_connection_checker_nulls插件来检测网络连接状态的示例代码。这个插件允许你检查设备当前是否有网络连接,并区分是WiFi还是移动数据连接。

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

dependencies:
  flutter:
    sdk: flutter
  data_connection_checker_nulls: ^x.y.z  # 请替换为最新版本号

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

接下来,在你的Flutter应用中,你可以这样使用data_connection_checker_nulls插件:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late DataConnectionChecker dataConnectionChecker;
  bool hasConnection = false;
  String connectionStatus = "Unknown";

  @override
  void initState() {
    super.initState();
    dataConnectionChecker = DataConnectionChecker();
    checkConnectionStatus();
  }

  Future<void> checkConnectionStatus() async {
    var status = await dataConnectionChecker.hasConnection;
    var type = await dataConnectionChecker.getConnectionType();

    setState(() {
      hasConnection = status;
      if (status) {
        if (type == DataConnectionType.wifi) {
          connectionStatus = "Connected to WiFi";
        } else if (type == DataConnectionType.mobile) {
          connectionStatus = "Connected to Mobile Data";
        } else if (type == DataConnectionType.none) {
          connectionStatus = "No Internet Connection";
        }
      } else {
        connectionStatus = "No Internet Connection";
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Network Connection Checker'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'Connection Status: $connectionStatus',
                style: TextStyle(fontSize: 24),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () async {
                  await checkConnectionStatus();
                },
                child: Text('Check Connection'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下事情:

  1. 添加依赖:在pubspec.yaml文件中添加了data_connection_checker_nulls依赖。
  2. 初始化插件:在initState方法中初始化了DataConnectionChecker实例。
  3. 检查网络连接:定义了一个checkConnectionStatus方法,使用dataConnectionChecker.hasConnection来检查是否有网络连接,并使用dataConnectionChecker.getConnectionType()来获取连接类型。
  4. 更新UI:根据网络连接状态更新UI显示。
  5. 按钮触发检查:提供了一个按钮,点击后可以重新检查网络连接状态。

请注意,data_connection_checker_nulls可能是一个特定于处理空安全问题的版本,如果你使用的是较新的Flutter版本,可能直接使用data_connection_checker就足够了。确保检查插件的文档和最新版本,以获取最新的使用方法和最佳实践。

回到顶部