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

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

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

简介

Internet Connection Checker Plus 是一个Flutter包,它能够以亚秒级响应时间检查您的互联网连接状态,即使是在移动网络上也能快速响应!

pub package GitHub GitHub issues GitHub issues closed

该库通过检查对各种 Uri 的可达性来监控和验证互联网连接。它依赖于 connectivity_plus 包来监听连接变化,并使用 http 包进行网络请求。

特性

  • 检查互联网连接状态
  • 监听互联网连接变化

支持平台

平台 检查连接 监听变化
Android
iOS
macOS
Linux
Windows
Web

权限设置

Android

AndroidManifest.xml 文件中添加以下权限:

<uses-permission android:name="android.permission.INTERNET" />

macOS

在 macOS 的 .entitlements 文件中添加以下权限:

<key>com.apple.security.network.client</key>
<true/>

更多信息请参考 Flutter Networking Documentation

使用方法

1. 添加依赖

pubspec.yaml 文件中添加 internet_connection_checker_plus 包:

dependencies:
  internet_connection_checker_plus: ^2.7.0

2. 导入包

在 Dart 文件中导入 internet_connection_checker_plus 包:

import 'package:internet_connection_checker_plus/internet_connection_checker_plus.dart';

3. 检查互联网连接

最简单的方法是使用 InternetConnection 类来检查互联网连接:

bool result = await InternetConnection().hasInternetAccess;

4. 监听互联网连接变化

InternetConnection 类提供了一个 InternetStatus 流,可以用来监听互联网连接的变化:

final listener = InternetConnection().onStatusChange.listen((InternetStatus status) {
  switch (status) {
    case InternetStatus.connected:
      // 互联网已连接
      break;
    case InternetStatus.disconnected:
      // 互联网已断开
      break;
  }
});

不要忘记在不再需要时取消订阅,以防止内存泄漏并释放资源:

listener.cancel();

5. 添加自定义 Uri 进行检查

InternetConnection 类可以配置为使用自定义 Uri 检查互联网连接:

final connection = InternetConnection.createInstance(
  customCheckOptions: [
    InternetCheckOption(uri: Uri.parse('https://example.com')),
  ],
);

重要提示: 确保自定义 Uri 没有启用缓存,否则结果可能不准确。在 web 平台上,确保自定义 Uri 不被 CORS 阻止。

6. 添加自定义成功标准

InternetConnection 类可以配置为使用自定义成功标准检查互联网连接:

final connection = InternetConnection.createInstance(
  customCheckOptions: [
    InternetCheckOption(
      uri: Uri.parse('https://example.com'),
      responseStatusFn: (response) {
        return response.statusCode >= 69 && response.statusCode < 169;
      },
    ),
    InternetCheckOption(
      uri: Uri.parse('https://example2.com'),
      responseStatusFn: (response) {
        return response.statusCode >= 420 && response.statusCode < 1412;
      },
    ),
  ],
);

7. 应用生命周期变化时暂停和恢复

在应用进入后台时暂停网络请求,在应用返回前台时恢复:

class MyWidget extends StatefulWidget {
  const MyWidget({super.key});

  @override
  State<MyWidget> createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  late final StreamSubscription<InternetStatus> _subscription;
  late final AppLifecycleListener _listener;

  @override
  void initState() {
    super.initState();
    _subscription = InternetConnection().onStatusChange.listen((status) {
      // 处理互联网状态变化
    });
    _listener = AppLifecycleListener(
      onResume: _subscription.resume,
      onHide: _subscription.pause,
      onPause: _subscription.pause,
    );
  }

  @override
  void dispose() {
    _subscription.cancel();
    _listener.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    // 构建你的组件
  }
}

默认 Uri

InternetConnection 类默认使用的 Uri 如下:

URI 描述
https://one.one.one.one 响应时间小于 100ms,CORS 启用,无缓存
https://icanhazip.com 响应时间小于 100ms,CORS 启用,无缓存
https://jsonplaceholder.typicode.com/todos/1 响应时间小于 100ms,CORS 启用,无缓存
https://reqres.in/api/users/1 响应时间小于 100ms,CORS 启用,无缓存

示例代码

以下是一个完整的示例代码,展示了如何在 Flutter 应用中使用 internet_connection_checker_plus 包:

// Flutter Packages
import 'package:flutter/material.dart';

// Pages
import 'pages/custom_success_criteria.dart';
import 'pages/custom_uris.dart';
import 'pages/listen_once.dart';
import 'pages/listen_to_stream.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Internet Connection Checker Plus Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  MyHomePage({super.key});

  final pages = {
    'Listen Once': const ListenOnce(),
    'Listen to Stream': const ListenToStream(),
    'Custom URIs': const CustomURIs(),
    'Custom Success Criteria': const CustomSuccessCriteria(),
  };

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: const Text('Internet Connection Checker Plus Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: pages.entries.map((entry) {
            return Padding(
              padding: const EdgeInsets.all(10.0),
              child: ElevatedButton(
                onPressed: () => Navigator.of(context).push(
                  MaterialPageRoute(
                    builder: (context) => entry.value,
                  ),
                ),
                child: Text(entry.key),
              ),
            );
          }).toList(),
        ),
      ),
    );
  }
}

希望这些信息对你有所帮助!如果你喜欢这个包,请给它一个 Like 👍🏼Star ⭐

致谢

此包是基于 internet_connection_checker 包修改而来,而后者又是基于 data_connection_checker 包修改而来,后者已不再维护。本包旨在支持 web 平台,这是 internet_connection_checker 包目前不支持的功能。


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

1 回复

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


当然,以下是如何在Flutter项目中使用internet_connection_checker_plus插件来检测网络连接的示例代码。

首先,确保你已经在pubspec.yaml文件中添加了internet_connection_checker_plus依赖:

dependencies:
  flutter:
    sdk: flutter
  internet_connection_checker_plus: ^1.0.0  # 请检查最新版本号

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

接下来,你可以在你的Flutter项目中编写代码来检测网络连接状态。以下是一个简单的示例:

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

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late InternetConnectionChecker _connectionChecker;
  late Future<bool> _connectionStatus;

  @override
  void initState() {
    super.initState();
    _connectionChecker = InternetConnectionChecker();
    _connectionStatus = _checkConnection();
  }

  Future<bool> _checkConnection() async {
    var connectionResult = await _connectionChecker.hasConnection;
    return connectionResult;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Internet Connection Checker Demo'),
      ),
      body: Center(
        child: FutureBuilder<bool>(
          future: _connectionStatus,
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) {
              return CircularProgressIndicator();
            } else if (snapshot.hasError) {
              return Text('Error: ${snapshot.error}');
            } else {
              bool hasConnection = snapshot.data ?? false;
              return Text(
                'Connection Status: ${hasConnection ? 'Connected' : 'Not Connected'}',
                style: TextStyle(fontSize: 24),
              );
            }
          },
        ),
      ),
    );
  }
}

代码解释:

  1. 依赖导入:在文件顶部导入internet_connection_checker_plus包。
  2. 初始化:在_MyHomePageStateinitState方法中,初始化InternetConnectionChecker实例,并调用_checkConnection方法来检查网络连接状态。
  3. 检查连接_checkConnection方法异步调用hasConnection属性,该属性返回一个Future<bool>,表示是否有网络连接。
  4. UI更新:使用FutureBuilder来监听_connectionStatus的状态。当连接状态正在检查时,显示一个CircularProgressIndicator;如果检查完成,显示连接状态文本。

这个示例展示了如何使用internet_connection_checker_plus插件在Flutter应用中检测网络连接状态,并根据状态更新UI。你可以根据需要对这个基础示例进行扩展和修改。

回到顶部