第二百一十四回

文章目录

  • 概念介绍
  • 实现方法
  • 示例代码
  • 经验总结

我们在上一章回中介绍了组件之间共享数据相关的内容,本章回中将介绍全局共享数据.闲话休提,让我们一起Talk Flutter吧。

概念介绍

我们在上一章回中介绍了使用InheritedWidget组件共享数据的方法,不过这种共享只限于父组件与子组件之间。本章回中将介绍一种全局共享数据的方式,这里说的
全局是指在任意组件之间。我们需要借助provider包实现全局数据共享功能,本章回中将详细介绍这方面的内容。此外,这种共享数据的方式也叫状态管理,因为在
Flutter中更新数据都是通过更新状态实现的,类似StatefulWidget组件中的通过setState()方法更新组件状态。

实现方法

我们首先介绍provider包,明白包中的内容后再介绍实现共享数据的方法,provider包提供了相关的类来实现数据共享功能,主要包含5个类,下面是它们的详细功能:

  • ChangeNotifier类:主要用来实现数据共享类,它的核心功能是提供notifyListeners()方法来通知其它组件更新数据;
  • ChangeNotifierProvider类:主要用来把数据共享类和监听数据变化的组件关联起来;
  • Provider类:主要用来获取共享数据,主要通过它的of()方法来获取数据共享类的实例;
  • Consumer类:主要用来获取共享数据,自带builder和child属性,通过builder属性获取数据共享类的实例;
  • Selector类:主要用来获取共享数据,自带builder,selector和child属性,通过builder属性获取数据共享类的实例;
    这些相互协作来实现数据共享功能,它的运行过程为:ChangeNotifier类提供共享数据,并且发出数据变化的通知,ChangeNotifierProvider类把数据更新的通
    知发给监听共享数据的组件,Provider,Consumer,Selector这三个类监听到数据变化的通知后从共享数据中获取数据。明白provider包的运行过程后,我们将介
    绍具体的实现方法:
  1. 在yaml文件中导入provider包,并且从网上获取包到本地项目中;
  2. 创建数据共享类,需要继承ChangeNotifier类,使用类中的notifyListeners()方法通知数据有更新;
  3. 使用ChangeNotifierProvider组件把数据共享类和监听数据变化的组件关联起来。该类有两个属性:
  • create:用来绑定ChangeNotifier类型对象,也就是数据共享类
  • child:用来指定哪些widegt可以接收到数据更新的通知;
  1. 获取更新后的数据,有三种方法:Provier,Consumer,Selector,我们在后面章回中介绍;

示例代码

///创建数据共享类,需要继承ChangeNotifier类,使用类中的notifyListeners()方法通知:数据有更新
class ViewModel extends ChangeNotifier {late String _data;ViewModel() {_data = 'init data';}String get getData {print('data is gotten at getter');return _data;}set setData(String value) {print('data is changed to \'$value\'at setter');_data = value;///当数据更新时通知更新UInotifyListeners();}
}///在整个应用的顶层设置Notifier,///在整个应用的任何位置都可以使用viewModel中共享的数据runApp(ChangeNotifierProvider(create:(context) => ViewModel(),child: const FlutterCookbookApp(),));

上面的代码中演示了数据共享类的实现和ChangeNotifierProvier类的实现,这里需要注意的是ChangeNotifierProvier类的实现,通常会把顶层的widget赋值
给该类的child属性,也就是把数据共享类和顶层的Widget绑定在一起,Flutter中的Widget是以树的形式进行管理,顶级widget相当于树根,如果把树根和数据共
享类绑定到一起,那么整棵树上任意的widget都可以获取共享数据。鉴于这个原理,我们通常把根widget和数据共享类绑定到一起,比如示例代码中就把整个项目的根
widget和数据共享类绑定到了一起,我们可以在项目中的任意Widget里获取共享数据。

经验总结

provider包的内容比较抽象不好理解,因此我们对本章回的内容总结如下,以方便大家快速入门provider包相关的知识:

  1. 创建数据共享类,并且在数据更新时通知监听器;
  2. 把数据共享类和顶层Widget通过ChangeNotificator关联起来;
  3. 在应用其它地方获取共享数据 ,获取的方式有三种:Provide, Consumer和Selector;
    下是我在项目中总结的一些经验,在此分享给大家:
    provide包背后的设计思路使用了观察者模式,我们可以把数据共享类当作被观察者,获取数据的类当作观察者,二者通过ChangeNotificator关联在了一起。这是我
    自己在使用过程中总结出的经验,使用这种类比的方式给大家介绍后是不是更加容易理解呢?
    provider包在源代码中也是使用了InheritedWidget组件来实现数据共享,只是它给开发都提供了好用的接口,让开发者以更加方便的方法实现数据共享功能。除了该
    包外还有其它的包可以实现数据共享的功能,比如rxDart,Redux,bloc,阿里的fish-redux等。大家可以到Flutter的包仓库中查看这些包的使用方法,不过我还
    是推荐provider包,毕竟这是官方文档中推荐使用的包,而且是flutter社区在维护,这给包在后续的维护和更新方面提供了保证。
    看官们,关于"全局共享数据概述"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

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

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

相关文章

智能优化算法应用:基于黑猩猩算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于黑猩猩算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于黑猩猩算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.黑猩猩算法4.实验参数设定5.算法结果6.参考文…

MinIO客户端之ls

MinIO提供了一个命令行程序mc用于协助用户完成日常的维护、管理类工作。 官方资料 mc ls 列出本地硬盘上的文件,命令如下: ./mc ls控制台的输出,如下: [2023-12-14 23:22:48 CST] 4.0KiB config/ [2023-12-14 23:31:03 CST] 4…

音视频学习(二十一)——rtmp收流(tcp方式)

前言 本文主要介绍rtmp协议收流流程,在linux上搭建rtmp服务器,通过自研的rtmp收流库发起取流请求,使用ffmpegqt实现视频流的解码与播放。 关于rtmp协议基础介绍可查看:https://blog.csdn.net/www_dong/article/details/13102607…

【机器学习】卷积神经网络(CNN)的特征数计算

文章目录 基本步骤示例图解过程 基本步骤 在卷积神经网络(CNN)中,计算最后的特征数通常涉及到以下步骤: 确定输入尺寸: 首先,你需要知道输入数据的尺寸。对于图像数据,这通常是 (batch_size, c…

Webpack安装及使用

win系统 全局安装Webpack及使用 前提:使用Webpack必须安装node环境,建议使用nvm管理node版本。 1:查看自己电脑是否安装了node 2:npm install webpack版本号 -g 3:npm install webpack-cli -g -g:表示全局安装 4&…

Wireshark在物联网中的应用

第一章:Wireshark基础及捕获技巧 1.1 Wireshark基础知识回顾 1.2 高级捕获技巧:过滤器和捕获选项 1.3 Wireshark与其他抓包工具的比较 第二章:网络协议分析 2.1 网络协议分析:TCP、UDP、ICMP等 2.2 高级协议分析:HTTP…

龙芯loongarch64服务器编译安装gcc-8.3.0

前言 当前电脑的gcc版本为8.3.0,但是在编译其他依赖包的时候,出现各种奇怪的问题,会莫名其妙的中断编译。本地文章讲解如何自编译安装gcc,替换系统自带的gcc。 环境准备 下载页面:龙芯开源社区网站 - LoongArch GCC 8.3 交叉工具链 - 源码下载源码包名称如:loongson-gnu…

2023楚慧杯 WEB方向 部分:(

1、eaaeval 查看源码能看见账号&#xff1a;username169&#xff0c;密码&#xff1a;password196提交这个用户密码可以跳转到页面/dhwiaoubfeuobgeobg.php 通过dirsearch目录爆破可以得到www.zip <?php class Flag{public $a;public $b;public function __construct(){…

2023-12-18 最大二叉树、合并二叉树、二叉搜索树中的搜索、验证二叉搜索树

654. 最大二叉树 核心&#xff1a;记住递归三部曲&#xff0c;一般传入的参数的都是题目给好的了&#xff01;把构造树类似于前序遍历一样就可&#xff01;就是注意单层递归的逻辑&#xff01; # Definition for a binary tree node. # class TreeNode: # def __init__(se…

【踩坑记录】pytorch 自定义嵌套网络时部分网络有梯度但参数不更新

问题描述 使用如下的自定义的多层嵌套网络进行训练&#xff1a; class FC1_bot(nn.Module):def __init__(self):super(FC1_bot, self).__init__()self.embeddings nn.Sequential(nn.Linear(10, 10))def forward(self, x):emb self.embeddings(x)return embclass FC1_top(nn…

强化产品联动:网关V7独家解决方案的三重优势

客户背景 某央企单位汇聚了众多业内优秀的工程师和科研人员&#xff0c;拥有先进的研发设施和丰富的研发经验&#xff0c;专注于为全球汽车行业提供创新和实用的解决方案。其研发成果不仅在国内市场上得到了广泛应用&#xff0c;也在国际市场上赢得了广泛的认可和赞誉。 客户需…

jconsole与jvisualvm

jconsole 环境变量配置好后 直接输入在cmd 输入jconsole 即可 jvisualvm cmd 输入jvisualvm jvisualvm 能干什么 监控内存泄露&#xff0c;跟踪垃圾回收&#xff0c;执行时内存、cpu 分析&#xff0c;线程分析… 运行&#xff1a;正在运行的 休眠&#xff1a;sleep 等待…

接口测试的工具(3)----postman+node.js+newman

1.安装newman&#xff1a;输入命令之后 一定注意 什么都不要操作 静静的等待结束就行了。 2.安装失败的对此尝试不行 在用下面的方法 解压一下就行了 3.验证是否成功 多次尝试是可以在线安装成功的

测试进程监控:确保产品质量的关键

引言&#xff1a; 在软件开发过程中&#xff0c;测试是确保产品质量的重要环节。为了提高测试效率和准确性&#xff0c;测试进程监控成为了不可或缺的工具。本文将介绍测试进程监控的各个方面&#xff0c;包括产品风险度量、缺陷度量源、测试用例&#xff08;或规程&#xff09…

Unity中Shader URP最简Shader框架(ShaderGraph 转 URP Shader)

文章目录 前言一、 我们先了解一下 Shader Graph 怎么操作1、了解一下 Shader Graph 的面板信息2、修改Shader路径3、鼠标中键 或 Alt 鼠标左键 移动画布4、鼠标右键 打开创建节点菜单5、把ShaderGraph节点转化为 Shader 代码6、可以看出 URP 和 BuildIn RP 大体框架一致 二、…

【Docker-2】在 Debian 上安装 Docker 引擎

在 Debian 上安装 Docker 引擎 要开始在 Debian 上使用 Docker 引擎&#xff0c;请确保满足先决条件&#xff0c;然后按照安装步骤操作。 先决条件 操作系统要求 要安装 Docker Engine&#xff0c;您需要以下 Debian 之一的 64 位版本 版本&#xff1a; Debian Bookworm 12…

隐私计算介绍

这里只对隐私计算做一些概念性的浅显介绍&#xff0c;作为入门了解即可 目录 隐私计算概述隐私计算概念隐私计算背景国外各个国家和地区纷纷出台了围绕数据使用和保护的公共政策国内近年来也出台了数据安全、隐私和使用相关的政策法规 隐私计算技术发展 隐私计算技术安全多方计…

C# WPF上位机开发(usb设备访问)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 目前很多嵌入式设备都支持usb访问&#xff0c;特别是很多mcu都支持高速usb访问。和232、485下个比较&#xff0c;usb的访问速度和它们基本不在一个…

C语言求n的阶乘(n!)

从键盘输入一个数&#xff0c;求出这个数的阶乘&#xff0c;即 n!。 1、算法思想 首先要清楚阶乘定义&#xff0c;所谓 n 的阶乘&#xff0c;就是从 1 开始乘以比前一个数大 1 的数&#xff0c;一直乘到 n&#xff0c;用公式表示就是&#xff1a;1234…(n-2)(n-1)nn! 具体的操…

unittest自动化测试框架讲解以及实战

为什么要学习unittest 按照测试阶段来划分&#xff0c;可以将测试分为单元测试、集成测试、系统测试和验收测试。单元测试是指对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作&#xff0c;通常指函数或者类&#xff0c;一般是开发完成的。 单元…