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

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

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

Pub

引言

此软件包提供了检查当前互联网连接状态的方法和流,并可以通过指定的URL检查是否有互联网访问。

特性

  • 检查当前互联网连接状态:断开或连接。
  • 通过特定的URL确定互联网连接。

平台注意事项

某些平台可能需要额外步骤,具体如下:

Android

Android应用程序必须在Android清单文件(AndroidManifest.xml)中声明其对互联网的使用:

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

macOS

macOS应用程序必须在其相关的.entitlements文件中允许网络访问:

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

更多关于设置权限的信息可以查看设置权限指南

使用方法

要使用此软件包,请确保将其添加到您的pubspec.yaml文件中:

dependencies:
  internet_connection_checker_service: ^1.1.5+1

示例用法:

final internetConnectionChecker = InternetConnectionCheckerService();

List<InternetConnectionOptions> optionURLs = [
  const InternetConnectionOptions(
    uri: 'https://google.com',
    timeout: Duration(seconds: 20),
  ),
  const InternetConnectionOptions(
    uri: 'https://bing.com',
    timeout: Duration(seconds: 20),
  ),
];

// 获取当前互联网连接状态。
final status = await internetConnectionChecker.connectionStatus;

// 监听互联网连接状态的变化。
StreamSubscription<InternetConnectionStatus>? _streamSubscription;

_streamSubscription = internetConnectionChecker
    .onInternetConnectionStatusChanged(optionURLs: optionURLs)
    .listen((status) {
  // 处理互联网连接状态的变化。
});

// 检查是否通过指定的URL有互联网访问。
final hasAccess = await internetConnectionChecker.hasInternetAccess(
  optionURLs: optionURLs,
);

// 注意,optionURLs 参数是可选的,可以省略。

示例代码

以下是完整的示例代码,展示了如何在应用中使用该插件:

import 'dart:async';

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

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

// 应用程序的根部件
class HomePage extends StatelessWidget {
  const HomePage({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      // 更多示例请参见:
      // https://github.com/logandx/internet_connection_checker_service/tree/main/example/lib/example
      home: Example1(),
    );
  }
}

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

  [@override](/user/override)
  State<Example1> createState() => _Example1State();
}

class _Example1State extends State<Example1> with WidgetsBindingObserver {
  StreamSubscription<InternetConnectionStatus>? _streamSubscription;
  InternetConnectionStatus? _lastStatus;
  final InternetConnectionCheckerService internetConnectionCheckerService =
      InternetConnectionCheckerService();

  // 要检查互联网连接的URL列表
  List<InternetConnectionOptions> optionURLs = [
    const InternetConnectionOptions(
      uri: 'https://google.com',
      timeout: Duration(seconds: 20),
    ),
    const InternetConnectionOptions(
      uri: 'https://youtube.com',
      timeout: Duration(seconds: 20),
    ),
  ];

  [@override](/user/override)
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
    // 订阅互联网连接状态变化
    _streamSubscription = internetConnectionCheckerService
        .onInternetConnectionStatusChanged(optionURLs: optionURLs)
        .listen((event) {
      _lastStatus = event;
      setState(() {});
    });
  }

  [@override](/user/override)
  void dispose() {
    // 取消订阅并移除观察者当部件被销毁时
    _streamSubscription?.cancel();
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  [@override](/user/override)
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    if (state == AppLifecycleState.resumed) {
      // 当应用程序恢复时重新订阅互联网连接状态
      _streamSubscription?.resume();
    } else if (state == AppLifecycleState.paused) {
      // 当应用程序暂停时暂停订阅
      _streamSubscription?.pause();
    }
  }

  Widget _buildContent(BuildContext context) {
    if (_lastStatus == null) {
      return Center(
        child: Text('$_lastStatus'),
      );
    }
    return Center(
      child: Container(
        padding: const EdgeInsets.all(16),
        color: _lastStatus == InternetConnectionStatus.disconnected
            ? Colors.red
            : Colors.green,
        child: Text(
          _lastStatus == InternetConnectionStatus.disconnected
              ? 'Disconnected'
              : 'Connected',
          style: Theme.of(context).textTheme.bodyLarge,
        ),
      ),
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Internet Connection Checker Example'),
      ),
      body: Column(
        children: [
          _buildContent(context),
          const SizedBox(height: 16),
          ElevatedButton(
            onPressed: () async {
              // 检查是否有互联网访问并显示一个Snackbar消息
              final hasAccess = await internetConnectionCheckerService
                  .hasInternetAccess(optionURLs: optionURLs);
              if (!context.mounted) {
                return;
              }
              if (hasAccess) {
                ScaffoldMessenger.of(context).showSnackBar(
                  const SnackBar(
                    content: Text('Internet access is available.'),
                  ),
                );
              } else {
                ScaffoldMessenger.of(context).showSnackBar(
                  const SnackBar(
                    content: Text('Internet access is not available.'),
                  ),
                );
              }
            },
            child: const Text('Check Internet Access'),
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何使用 internet_connection_checker_service 插件在 Flutter 中检测网络连接的代码示例。这个插件允许你轻松检查设备是否有活动的网络连接。

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

dependencies:
  flutter:
    sdk: flutter
  internet_connection_checker: ^0.0.1+3  # 请注意版本号,这里用的是示例版本号,实际使用时请检查最新版本

然后运行 flutter pub get 来获取依赖。

接下来,在你的 Flutter 项目中,你可以按照以下步骤使用该插件:

  1. 导入插件
import 'package:internet_connection_checker/internet_connection_checker.dart';
  1. 创建并初始化一个 InternetConnectionChecker 实例
class _MyAppState extends State<MyApp> {
  final InternetConnectionChecker _connectionChecker = InternetConnectionChecker();
  bool _isConnected = false;

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

  Future<void> _checkConnection() async {
    var connectivityResult = await _connectionChecker.checkConnection();
    if (connectivityResult == ConnectivityResult.connected) {
      setState(() {
        _isConnected = true;
      });
    } else {
      setState(() {
        _isConnected = false;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Network Connection Checker'),
        ),
        body: Center(
          child: Text(
            _isConnected ? 'Connected to the Internet' : 'Not Connected to the Internet',
            style: TextStyle(fontSize: 24),
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () async {
            // 再次检查连接
            await _checkConnection();
            // 这里可以添加额外的逻辑,比如显示Snackbar通知用户连接状态
          },
          tooltip: 'Check Connection',
          child: Icon(Icons.refresh),
        ),
      ),
    );
  }
}
  1. 在你的主文件中使用这个状态类
void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: _MyAppState(),
    );
  }
}

这个示例展示了如何创建一个简单的 Flutter 应用,该应用会在启动时检查网络连接状态,并在屏幕上显示结果。此外,用户可以通过点击浮动操作按钮(FAB)来手动重新检查连接状态。

这个示例代码使用了 setState 方法来更新 UI,每当连接状态改变时,UI 都会重新渲染以反映最新的连接状态。同时,InternetConnectionChecker 插件的 checkConnection 方法会返回一个 ConnectivityResult,你可以根据这个结果来判断设备是否连接到互联网。

回到顶部