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

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

标题

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

内容

  • connectivity_plus extended with Internet Connectivity

    • 这个包扩展了connectivity_plus插件:
      • 带有互联网连接状态(可按需访问或通过变更流访问),
      • 解决了Android应用从后台恢复时刷新连接的问题,
      • 具有两种状态:connectivity_plus和互联网连接状态(有一些限制,见下文重要说明)。
  • Usage

    • Access to the original connectivity_plus members

      • checkConnectivity

        final ConnectivityPlusState state = await Connectivity().checkConnectivityPlusState();
        
        print(state); // ConnectivityPlusState.none, .mobile, .ethernet, etc.
        
      • onConnectivityChanged stream

        Connectivity().getConnectivityPlusStream().listen((state) {
          // It is guaranteed that two successive events have different values.
          print(result);
        });
        
    • Internet connectivity

      • 对于互联网连接,此包使用ac_inet_connectivity_checker并推荐配置根域名服务器的IPv4和IPv6地址。
        final state = Connectivity().lastInetConnectivityState;
        
        if (state == InetConnectivityState.disconnected) {
          // disconnected (same as ConnectivityResult.none)
        } else if (state == InetConnectivityState.connected) {
          // connected to a network without Internet access.
        } else if (state == InetConnectivityState.internet) {
          // connected to Internet.
        }
        
    • On-demand fresh value

      • 相对于网络连接测试,互联网连接测试允许定义超时。如果自己处理超时,则可以使用可取消的操作。注意,如果没有指定超时,可能会使用默认操作系统超时,通常是120秒。
        final cancelableOperation = Connectivity().checkInetConnectivityState(
          timeout: const Duration(seconds: 3),
        );
        
        final state = await cancelableOperation.value;
        
    • Stream

      • Important note on Internet Connectivity Stream

        • 检测互联网连接变化需要持续背景测试,以确保当应用程序重新上线时能够快速通知。
        • 如果设备更改网络配置(例如,从4G网络切换到Wi-Fi网络),互联网检测几乎会立即发生。
        • 而如果设备连接到具有无互联网访问的路由器的Wi-Fi网络,则可能需要指定backgroundChecksInterval配置中的时间(默认为0秒)来检测丢失连接。
        • Connectivity().lastInetConnectivityState == InetConnectivityState.internet时,该包选择不进行常量背景互联网检查。相反,它提供了一个notifyChange方法,您必须在HTTP请求错误时调用。即使不确定也可以调用它。
        import 'package:http/http.dart' as http;
        
        try {
          var response = await http.get(Uri.https('google.com'));
        } on SocketException {
          Connectivity().notifyChange();
        
          rethrow;
        } catch(error) {
          print(error);
        }
        
        • 如果真的想实现常量背景互联网检查,可以参考以下示例:

      CancelableTimer? connectivityChecker;

      Connectivity().listen((state) { if (state == InetConnectivityState.internet) { connectivityChecker = CancelableTimer.periodic( const Duration(seconds: 60), (_) => Connectivity().checkInetConnectivityState(), wait: true, ); } else { connectivityChecker?.cancel(); connectivityChecker = null; } })

      
      

示例代码

// SPDX-FileCopyrightText: © 223 - 2024 Anthony Champagne <dev@anthonychampagne.fr>
//
// SPDX-License-Identifier: BSD-3-Clause

import 'dart:async';

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Flutter Demo',
      home: MyHomePage(),
    );
  }
}

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

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  ConnectivityPlusState? _lastConnectivityPlusState;
  InetConnectivityState? _lastInetConnectivityState;
  StreamSubscription? _inetConnectivityStreamSubscription;
  StreamSubscription? _connectivityPlusStreamSubscription;

  [@override](/user/override)
  void initState() {
    super.initState();

    _lastConnectivityPlusState = Connectivity().lastConnectivityPlusState;
    _lastInetConnectivityState = Connectivity().lastInetConnectivityState;

    _connectivityPlusStreamSubscription =
        Connectivity().getConnectivityPlusStream().listen((state) {
      setState(() {
        _lastConnectivityPlusState = state;
      });
    });

    _inetConnectivityStreamSubscription = Connectivity().listen((state) {
      setState(() {
        _lastInetConnectivityState = state;
      });
    });
  }

  [@override](/user/override)
  void dispose() {
    _inetConnectivityStreamSubscription?.cancel();
    _connectivityPlusStreamSubscription?.cancel();

    super.dispose();
  }

  void _notifyConnectivityChange() {
    Connectivity().notifyChange();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text('Last connectivity_plus state:'),
            Text(
              '$_lastConnectivityPlusState',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
            const SizedBox(height: 20),
            const Text('Last Internet connectivity state:'),
            Text(
              '$_lastInetConnectivityState',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _notifyConnectivityChange,
        tooltip: 'Notify connectivity change',
        child: const Icon(Icons.refresh),
      ),
    );
  }
}

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

1 回复

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


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

首先,确保你的Flutter项目已经创建,并且在pubspec.yaml文件中添加了ac_connectivity依赖:

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

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

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

  1. 导入插件

在你的Dart文件中导入ac_connectivity插件。

import 'package:ac_connectivity/ac_connectivity.dart';
import 'package:flutter/material.dart';
  1. 初始化插件并监听网络连接状态

你可以在你的StatefulWidget中初始化AcConnectivity对象,并使用一个StreamSubscription来监听网络连接状态的变化。

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

class _MyAppState extends State<MyApp> {
  AcConnectivity _connectivity = AcConnectivity();
  bool _isConnected = false;

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

  void _listenForConnectivityChanges() {
    var subscription = _connectivity.onConnectivityChanged.listen((ConnectivityResult result) {
      if (result == ConnectivityResult.wifi || result == ConnectivityResult.mobile) {
        setState(() {
          _isConnected = true;
        });
      } else {
        setState(() {
          _isConnected = false;
        });
      }
    });

    // 确保在widget销毁时取消订阅
    @override
    void dispose() {
      subscription.cancel();
      super.dispose();
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Network Connectivity Demo'),
        ),
        body: Center(
          child: Text(
            _isConnected ? 'Connected to the internet' : 'Not connected to the internet',
            style: TextStyle(fontSize: 24),
          ),
        ),
      ),
    );
  }
}

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

在上面的代码中,我们做了以下几件事:

  • 导入ac_connectivityflutter/material.dart
  • 创建一个StatefulWidget,并在其State中初始化AcConnectivity对象。
  • 使用_connectivity.onConnectivityChanged.listen方法来监听网络连接状态的变化。
  • 根据网络连接状态更新UI。
  • dispose方法中取消订阅,以防止内存泄漏。

这样,你的Flutter应用就能够检测网络连接状态,并根据状态更新UI了。注意,确保在实际使用中检查最新的ac_connectivity插件文档和API变化。

回到顶部