Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听(断网/网络恢复事件监听)

Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听(断网/网络恢复事件监听)

目录

Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听(断网/网络恢复事件监听)

一、简单介绍

二、connectivity_plus

1、connectivity_plus 实现断网和网络连接状态的事件监听原理

2、使用 connectivity_plus 的注意事项

三、安装 connectivity_plus

四、简单效果

五、简单案例实现

六、关键代码


一、简单介绍

Flutter 是一款开源的 UI 软件开发工具包,由 Google 开发和维护。它允许开发者使用一套代码同时构建跨平台的应用程序,包括移动设备(iOS 和 Android)、Web 和桌面平台(Windows、macOS 和 Linux)。

Flutter 使用 Dart 编程语言,它可以将代码编译为 ARM 或 Intel 机器代码以及 JavaScript,从而实现快速的性能。Flutter 提供了一个丰富的预置小部件库,开发者可以根据自己的需求灵活地控制每个像素,从而创建自定义的、适应性强的设计,这些设计在任何屏幕上都能呈现出色的外观和感觉。

 

二、connectivity_plus

网址:connectivity_plus | Flutter package

connectivity_plus 是一个 Flutter 插件,用于监听设备的网络状态变化,包括 Wi-Fi、移动网络和无网络连接等状态。它通过提供一个简单的 API,允许开发者实时获取网络连接状态,并在状态发生变化时接收通知。通过订阅网络状态变化的流,开发者可以在应用中实现动态响应网络变化的功能,例如提示用户网络连接问题或调整应用的行为。

1、connectivity_plus 实现断网和网络连接状态的事件监听原理

connectivity_plus 插件通过监听设备的网络连接变化事件来实现网络状态的监听。它利用了底层平台(如 Android 和 iOS)提供的网络状态检测能力,并通过 Dart 的 Stream 提供实时更新。

  • Android:在 Android 上,connectivity_plus 使用 ConnectivityManager 来监听网络状态变化。当网络连接类型发生变化时(如从 Wi-Fi 切换到移动网络,或网络断开),系统会触发事件,插件捕获这些事件并通过 Dart 的 Stream 传递给 Flutter 应用。

  • iOS:在 iOS 上,插件通过 Network 框架的 NWPathMonitor 来监听网络路径的变化。当网络状态发生变化时,插件会收到通知,并将这些变化通过 Stream 传递给 Flutter 应用。

2、使用 connectivity_plus 的注意事项

  • 网络状态的不确定性
    • 即使插件报告了网络连接类型(如 Wi-Fi 或移动网络),也不能保证该网络一定可以访问互联网。例如,某些 Wi-Fi 网络可能需要用户登录才能访问互联网。

    • 开发者应始终准备处理网络请求的超时和错误,而不是完全依赖当前的网络状态。

  • 权限要求

    • 在某些平台上(如 Android 和 iOS),需要在应用的配置文件中声明网络状态监听权限。例如,在 Android 上需要在 AndroidManifest.xml 中添加 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

  • 资源管理

    • 监听网络状态变化时,需要使用 StreamSubscription 订阅 onConnectivityChanged 流。在不再需要监听时,必须调用 cancel() 方法取消订阅,以避免资源泄漏。

  • 初始化检查

    • 在应用启动时,建议调用 checkConnectivity() 方法获取当前的网络状态,以确保应用在启动时就能正确处理网络状态。

  • 用户体验

    • 在某些场景下(如用户未授权网络访问权限),应用可能会出现短暂的无网络状态。开发者可以通过在开屏页提示用户授权网络访问,来改善用户体验。

通过合理使用 connectivity_plus 插件并注意上述事项,开发者可以在 Flutter 应用中有效地管理网络状态,提升应用的健壮性和用户体验。

三、安装 connectivity_plus

1、直接运行命令

使用 Flutter:flutter pub add connectivity_plus

2、或者在 pubspec.yaml 添加

dependencies:connectivity_plus: ^6.1.3

四、简单效果

五、简单案例实现

1、这里使用 Android Studio 进行创建 Flutter 项目

2、创建一个 application 的 Flutter 项目

3、项目结构如下

4、实现一个 NetworkStatusManager 类,监听网络断开和恢复的事件

5、在 main 测试 网络网络断开和恢复的事件监听功能

6、连接设备,运行简单效果如下

六、关键代码

1、NetworkStatusManager

import 'dart:async';
import 'package:connectivity_plus/connectivity_plus.dart';// 定义回调函数类型
// 网络状态变化时的回调函数,参数为当前的网络状态列表
typedef NetworkStatusCallback = void Function(List<ConnectivityResult> result);// 网络连接时的回调函数,无参数
typedef NetworkConnectedCallback = void Function();// 网络断开时的回调函数,无参数
typedef NetworkDisconnectedCallback = void Function();class NetworkStatusManager {// 使用 Connectivity 插件实例来监听网络状态变化final Connectivity _connectivity = Connectivity();// StreamSubscription 用于订阅网络状态变化事件late StreamSubscription<List<ConnectivityResult>> _connectivitySubscription;// 定义回调函数// 网络状态变化时的回调函数late NetworkStatusCallback _onNetworkChanged;// 网络连接时的回调函数late NetworkConnectedCallback _onNetworkConnected;// 网络断开时的回调函数late NetworkDisconnectedCallback _onNetworkDisconnected;// 初始化网络状态管理器// 参数:// - onNetworkChanged:网络状态变化时的回调函数// - onNetworkConnected:网络连接时的回调函数// - onNetworkDisconnected:网络断开时的回调函数void initNetworkStatusManager({required NetworkStatusCallback onNetworkChanged,required NetworkConnectedCallback onNetworkConnected,required NetworkDisconnectedCallback onNetworkDisconnected,}) {// 保存回调函数_onNetworkChanged = onNetworkChanged;_onNetworkConnected = onNetworkConnected;_onNetworkDisconnected = onNetworkDisconnected;// 监听网络状态变化// 使用 _connectivity.onConnectivityChanged 获取网络状态变化的流// 并订阅该流,当网络状态变化时调用 _handleConnectivityChange 方法_connectivitySubscription =_connectivity.onConnectivityChanged.listen(_handleConnectivityChange);}// 处理网络状态变化// 参数:// - result:当前的网络状态列表void _handleConnectivityChange(List<ConnectivityResult> result) {// 调用网络状态变化的回调函数_onNetworkChanged?.call(result);// 检查网络状态// 如果 result 中包含 ConnectivityResult.none,则认为网络断开if (result.contains(ConnectivityResult.none)) {// 调用网络断开的回调函数_onNetworkDisconnected?.call();} else {// 否则认为网络连接// 调用网络连接的回调函数_onNetworkConnected?.call();}}// 取消监听// 释放资源,取消对网络状态变化事件的订阅void dispose() {_connectivitySubscription.cancel();}
}

代码说明

  1. 回调函数类型定义

    • NetworkStatusCallback:当网络状态发生变化时调用,参数为当前的网络状态列表。

    • NetworkConnectedCallback:当网络连接时调用,无参数。

    • NetworkDisconnectedCallback:当网络断开时调用,无参数。

  2. 类成员变量

    • _connectivityConnectivity 插件实例,用于监听网络状态变化。

    • _connectivitySubscription:用于订阅网络状态变化事件的 StreamSubscription

    • _onNetworkChanged_onNetworkConnected_onNetworkDisconnected:分别用于处理网络状态变化、网络连接和网络断开的回调函数。

  3. initNetworkStatusManager 方法

    • 初始化网络状态管理器,接收三个回调函数作为参数。

    • 订阅网络状态变化事件,当网络状态变化时调用 _handleConnectivityChange 方法。

  4. _handleConnectivityChange 方法

    • 处理网络状态变化事件。

    • 调用 _onNetworkChanged 回调函数,通知调用者网络状态已变化。

    • 根据网络状态调用 _onNetworkConnected_onNetworkDisconnected 回调函数。

  5. dispose 方法

    • 取消对网络状态变化事件的订阅,释放资源。

2、main

import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:flutter/material.dart';
import 'network_status_manager.dart'; // 假设你将上述代码保存为 network_status_manager.dartvoid main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);@overrideWidget build(BuildContext context) {// 创建一个 MaterialApp,这是 Flutter 应用的根组件return MaterialApp(title: 'Flutter Demo', // 应用的标题theme: ThemeData(// 定义应用的主题useMaterial3: true, // 使用 Material Design 3colorSchemeSeed: const Color(0x9f4376f8), // 主题颜色种子),home: const MyHomePage(title: 'Flutter Demo Home Page'), // 应用的首页);}
}class MyHomePage extends StatefulWidget {const MyHomePage({Key? key, required this.title}) : super(key: key);// 页面的标题final String title;@overrideState<MyHomePage> createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {// 当前的网络状态列表,默认为 [ConnectivityResult.none],表示没有网络连接List<ConnectivityResult> _connectionStatus = [ConnectivityResult.none];// 网络状态管理器实例late NetworkStatusManager _networkStatusManager;@overridevoid initState() {super.initState();// 创建一个 NetworkStatusManager 实例_networkStatusManager = NetworkStatusManager();// 初始化网络状态管理器,并设置回调函数_networkStatusManager.initNetworkStatusManager(onNetworkChanged: (result) {// 当网络状态发生变化时,更新 _connectionStatus 并刷新 UIsetState(() {_connectionStatus = result;});// 打印网络状态变化print('Network status changed: $_connectionStatus');},onNetworkConnected: () {// 当网络连接时,打印日志print('Network connected');},onNetworkDisconnected: () {// 当网络断开时,打印日志print('Network disconnected');},);}@overridevoid dispose() {// 释放资源,取消对网络状态变化事件的订阅_networkStatusManager.dispose();super.dispose();}@overrideWidget build(BuildContext context) {// 构建页面的 UIreturn Scaffold(appBar: AppBar(// 页面的标题栏title: const Text('Network Status Example'),elevation: 4, // 标题栏的阴影高度),body: Column(// 页面的主体内容,使用 Column 布局mainAxisSize: MainAxisSize.min, // 设置 Column 的最小高度children: [const Spacer(flex: 2), // 添加一个占位符,用于间距Text(// 显示当前的网络状态标题'Active connection types:',style: Theme.of(context).textTheme.headlineMedium, // 使用主题的标题样式),const Spacer(), // 添加一个占位符,用于间距ListView(// 使用 ListView 显示当前的网络状态列表shrinkWrap: true, // 允许 ListView 自动调整大小children: _connectionStatus.map((status) {// 遍历 _connectionStatus 列表,生成每个网络状态的文本return Center(child: Text(status.toString(), // 显示网络状态的字符串表示style: Theme.of(context).textTheme.headlineSmall, // 使用主题的小标题样式),);}).toList(),),const Spacer(flex: 2), // 添加一个占位符,用于间距],),);}
}

代码说明

  1. MyApp

    • 这是 Flutter 应用的根组件,负责创建 MaterialApp,配置应用的主题和首页。

    • MaterialApp 是 Flutter 中用于创建 Material Design 风格应用的组件。

  2. MyHomePage

    • 这是一个 StatefulWidget,表示应用的首页。

    • 它包含一个 title 属性,用于显示页面的标题。

  3. _MyHomePageState

    • 这是 MyHomePage 的状态类,用于管理页面的状态和逻辑。

    • _connectionStatus:用于存储当前的网络状态列表。

    • _networkStatusManager:用于管理网络状态监听的实例。

  4. initState 方法

    • 在页面初始化时调用。

    • 创建 NetworkStatusManager 实例,并初始化网络状态管理器。

    • 设置三个回调函数:

      • onNetworkChanged:当网络状态发生变化时调用,更新 _connectionStatus 并刷新 UI。

      • onNetworkConnected:当网络连接时调用,打印日志。

      • onNetworkDisconnected:当网络断开时调用,打印日志。

  5. dispose 方法

    • 在页面销毁时调用。

    • 释放资源,取消对网络状态变化事件的订阅。

  6. build 方法

    • 构建页面的 UI。

    • 使用 Scaffold 创建一个带标题栏的页面。

    • 使用 Column 布局,显示当前的网络状态标题和网络状态列表。

    • 使用 ListView 遍历 _connectionStatus 列表,生成每个网络状态的文本。

测试结果

运行上述代码后,应用将正确监听网络状态的变化:

  • 当网络连接时,会调用 onNetworkConnected 回调函数,并打印 "Network connected"。

  • 当网络断开时,会调用 onNetworkDisconnected 回调函数,并打印 "Network disconnected"。

  • 同时,onNetworkChanged 回调函数会更新 _connectionStatus,并在 UI 中显示当前的网络连接类型。

希望这些注释和代码对你有帮助!如果有任何问题,请随时告诉我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/39127.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab的meshgrid

文章目录 一、什么是 meshgrid&#xff1f;二、基本语法三、为什么需要 meshgrid&#xff1f;四、meshgrid 与 ndgrid 的区别 一、什么是 meshgrid&#xff1f; meshgrid 是 MATLAB 中用于生成网格点坐标矩阵的函数&#xff0c;常用于三维绘图&#xff08;如 surf, mesh, cont…

word插入Mathtype公式居中和自动更新

word插入公式自动更新 前提&#xff1a;安装Mathtype 1.word中查看页的宽度 出现如下 2.设置样式 出现这个窗口 给样式随便起个名字 3.修改样式 3.1 设置两个制表位 第二个 3.2 修改公式字体 如下所示 4. 修改公式格式 4.1在word中打开 Mathtype 4.2 修改公式的格式 变成…

用 pytorch 从零开始创建大语言模型(六):对分类进行微调

用 pytorch 从零开始创建大语言模型&#xff08;六&#xff09;&#xff1a;对分类进行微调 6 微调用于分类6.1 微调的不同类别6.2 准备数据集6.3 创建数据加载器6.4 使用预训练权重初始化模型6.5 添加分类头部6.6 计算分类损失和准确率6.7 在监督数据上微调模型6.8 使用LLM进…

阿里云对象存储教程

搜“对象存储->免费试用” 选择你的心仪产品&#xff0c;我使用的是第一个 创建后获得三个实例&#xff1a; 点击右上角自己的账号可以进入到AccessKey管理界面 回到对象存储控制台创建Bucket实例 在以下文件中替换自己Bucket的信息即可美美使用~ package com.kitty.blog…

基于Python的智慧金融风控系统的设计与实现

指导途径&#xff08;&#x1f6f0;&#xff09;&#xff1a;NzqDssm16 1立题依据 1.1毕业论文&#xff08;设计&#xff09;的研究背景 随着金融行业数字化转型加速&#xff0c;智能风控系统成为防范金融风险的核心支撑。传统风控手段存在数据处理效率低下、模型更新滞后、人…

分布式算法:Paxos Raft 两种共识算法

1. Paxos算法 Paxos算法是 Leslie Lamport&#xff08;莱斯利兰伯特&#xff09;在 1990 年提出的一种分布式系统共识算法。也是第一个被证明完备的共识算法&#xff08;前提是不存在恶意节点&#xff09;。 1.1 简介 Paxos算法是第一个被证明完备的分布式系统共识算法。共识…

Day20-前端Web案例——部门管理

目录 部门管理1. 前后端分离开发2. 准备工作2.1 创建Vue项目2.2 安装依赖2.3 精简项目 3. 页面布局3.1 介绍3.2 整体布局3.3 左侧菜单 4. Vue Router4.1 介绍4.2 入门4.3 案例4.4 首页制作 5. 部门管理5.1部门列表5.1.1. 基本布局5.1.2 加载数据5.1.3 程序优化 5.2 新增部门5.3…

信创-人大金仓数据库创建

一. 官文 资源下载地址 https://download.kingbase.com.cn/xzzx/index.htm 下载安装文件 下载授权文件 产品文档地址&#xff1a;https://help.kingbase.com.cn/v8/index.html 二. 概念 2.1 体系结构 ‌ 实例结构 ‌&#xff1a;由数据库文件和 KingbaseES 实例组成。数据…

[ACTF2020 新生赛]BackupFile-3.23BUUCTF练习day5(1)

[ACTF2020 新生赛]BackupFile-3.23BUUCTF练习day5(1) 解题过程 打开题目环境 看题目意思应该是让我找备份文件 备份文件一般的后缀名为 .rar .zip .7z .tar.gz .bak .swp .txt .html .bak 直接扫描一下 在url中输入/index.php.bak 弱类型比较 为弱相等&#xff0c;即当…

【嵌入式Linux】基于ArmLinux的智能垃圾分类系统项目

目录 1. 功能需求2. Python基础2.1 特点2.2 Python基础知识2.3 dict嵌套简单说明 3. C语言调用Python3.1 搭建编译环境3.2 直接调用python语句3.3 调用无参python函数3.4 调用有参python函数 4. 阿里云垃圾识别方案4.1 接入阿里云4.2 C语言调用阿里云Python接口 5. 香橙派使用摄…

css的背景

css背景属性&#xff0c;可以给页面元素添加背景样式。 一.背景颜色 二.背景图片 语法 backgroud-image &#xff1a;none || url(图像地址) 三.背景平铺 既可以添加背景颜色也可以添加背景图片&#xff0c;只不过背景图片会压住背景颜色 四.背景位置 1.方位名词 如果只指定…

macOS Sequoia 15.3 一直弹出“xx正在访问你的屏幕”

&#x1f645; 问题描述 macOS 系统升级后&#xff08;15.2或者15.3均出现过此问题&#xff09;&#xff0c;不管是截图还是开腾讯会议&#xff0c;只要跟捕捉屏幕有关&#xff0c;都一直弹出这个选项&#xff0c;而且所有软件我都允许访问屏幕了&#xff0c;这个不是询问是否…

高德终端技术总结:高可用架构如何练成?

前言 高德地图作为国民级应用&#xff0c;特别是出行场景的独特性&#xff0c;要确保在线导航高并发和交通安全级的超稳定性&#xff0c;这对技术团队提出异乎寻常的高要求&#xff0c;无论是终端、云端&#xff0c;还是“终端-云端”之间的连接&#xff0c;都必须实现“高可用…

UDP套接字编程(代码)

什么是socket套接字编程&#xff1f; 通过Ip地址 端口号这种方式定位一台主机&#xff0c;这样的方式我们就叫做socket套接字。 Udp Socket 接口介绍 这些案列我们使用的接口基本都是一样的&#xff0c;所以在这里我先把接口介绍完&#xff0c;具体的细节后面在说明。 创…

C# 调用 VITS,推理模型 将文字转wav音频net8.0 跨平台

一、系统环境 操作系统&#xff1a;win10&#xff0c;win11 运行环境&#xff1a;dotnet8 工具:命令行&#xff0c;powershell 开源库:sherpa-onnx 二、工具和源码下载 开源库:https://k2-fsa.github.io/sherpa/onnx/index.html 运行环境下载 https://dotnet.microsoft.c…

【AI学习笔记】Coze平台实现将Excel文档批量导入数据库全过程

背景前摇&原视频教程&#xff1a; 最近看到很多同学都在用Coze平台操作数据&#xff0c;我也想了解一下工作流的搭建和数据处理过程&#xff0c;但是一下子又看不懂太复杂的逻辑&#xff0c;于是上B站搜索相关的基础教程。 Coze官方教程&#xff1a; 之前有看过Coze平台…

Certd自动化申请和部署SSL证书并配置https

服务器使用的华为云&#xff0c;之前SSL证书通过配置Cloudflare的DNS实现的&#xff0c;最近华为云备案提示需修改解析至境内华为云IP&#xff0c;若解析境外IP&#xff0c;域名无需备案&#xff0c;需注销或取消接入备案信息&#xff0c;改为使用Certd自搭建证书管理工具&…

AI基础01-文本数据采集

本篇文章是学习文本数据的采集&#xff0c;作为人工智能训练师或者数据分析师有时需要先获取数据&#xff0c;然后进行数据清洗、数据标注。很明显数据采集是后续步骤的基础。 1&#xff09;数据采集定义 数据采集&#xff1a;data acquisition&#xff0c;DAQ 又称为数据获取…

生活电子常识-deepseek-r1本地化部署+ui界面搭建

前言 deepseek-r1 14b模型&#xff0c;32b模型部署在本地电脑上也能实现非常好的性能。 因此有兴趣研究了下如何在本地部署。 同时最新流行mauns工作流&#xff0c;他们提供一句话实现网页端任意应用的能力。实际上&#xff0c;你也可以用本地的模型来实现离线的ai工作流功能。…

vue3+ts中 .vue文件引入报错:找不到模块或其相应的类型声明

新创建的vue3项目在vscode打开出现报错&#xff1a;找不到模块或其相应的类型声明 解决&#xff1a;在env.d.ts文件添加配置&#xff1a; declare module *.vue {import type { DefineComponent } from vue// eslint-disable-next-line typescript-eslint/no-explicit-any, …