什么是状态管理,有哪些实现?

news/2024/12/20 2:20:41/文章来源:https://www.cnblogs.com/oldsaltfish/p/18618196

概念

“状态管理”是指在应用程序中有效地组织、更新和共享数据的方式。

比起数据库和本地之类的持久层,有时我们需要存储一些应用运行过程中的临时数据,其中大部分可能都不会存入数据库。因此,状态这个词还是挺贴切的。

比较熟悉的是vue中Pinia提供的状态管理,他是全局可访问的,而且是响应式的。

数据传递

比较简单的父子组件传递数据。

  1. 父-->子父组件通过属性、构造等,直接将数据传递给子组件。
  2. 子-->父 父组件提供回调函数,使子组件调用该函数,并传入值,使得父组件获取到值并做出反应。

然而显然这种简单的做法并不普适,多级时,比如父亲和孙子,父亲需要将值先传递给儿子,再由儿子转交给孙子,然而儿子并不关心这个数据。从结果上来说,你在儿子那里多写了不必要的代码,然而使用这种方法时不得不写。

全局对象

那么全局的方案就值得思考了。我们使用全局对象,将两个本不相关的组件联系了起来。

  1. 需要通信的组件都会依赖这个全局对象
  2. 不进行通信的组件将会不受影响。

组件UI的刷新

状态管理本身通常不直接包含 UI 界面的刷新概念,但它是驱动 UI 更新的关键部分。
因为很多情况下,我们希望对某个组件的操作,能够影响另一个组件。

Pinia

在Pinia和Vue中,存储的数据是响应式的,数据改变后,页面会自动刷新。

Fluuter的Provider

Flutter中,官方Provider库,Notifier这一系列解决方法,类似于父子之间的通信。

  1. 在祖宗组件上绑定数据源。
  2. 在后代组件上访问数据。
  3. 在数据源的定义处,定义方法来更改数据并通知页面进行刷新。

对于对UI有影响的数据,我们使用以下方法对UI进行重构。

notifyListeners();

Provider的做法,是观察者模式,即订阅=>通知
然而存在比较大的缺陷,首先,你需要为两个进行通信的组件的最近的父节点套一层ChangeNotifierProvider
比如,如图片所示,红框框起来的两个组件进行通信(数据传递),我们需要在节点树往上找,找到共同的祖宗节点。
image
数据,也就是Notifier的实例,寄宿在祖宗节点上,下面的任意一个节点都可以访问到这些数据。

那么显然面临着一个问题。

  1. 没有共同祖宗节点的组件无法传递数据。

除此之外还面临着一个问题(因为我进行了相关测试),如果给两个节点的父节点绑定了相同的数据源,那么默认写法是两个不同的实例,所以数据肯定也不同,因此我尝试了单例模式。但是还是不行,在Flutter里面,页面和ViewModel是绑定的,如果页面销毁,ViewModel也会销毁,而销毁后我们依然去访问,就会出现问题。

  1. ViewModel会随着页面销毁。

这里的ViewModel,和前面的数据源是同一个东西。

下面是一些废话

水平太低,踩了很多坑。

我硬着头皮用了Provider,解决这个问题应该还是有一些思路。
再创建一个独立的ViewModel,而由于是从Hive数据库获取的数据,因此两个不同的ViewModel的数据可以做到同步。
问题在于,不同的ViewModel,其订阅者也是独立的,还记得我前面提到的观察者模式吗,ViewModel或者说Notifier更新数据后,需要手动调用notifyListeners();方法来通知UI进行重构。由于两个页面各是各的ViewModel,订阅者也只是自己的页面中的组件,无法通知对方进行UI的刷新。

这个问题困扰了我一段时间,弄得很烦躁。

我刚才灵光一闪,想出了一个不太美观的方法。

  1. 假设组件A与B进行通信,各自创建ViewModel,绑到父组件上。
  2. ViewModel使用单例模式,由于单个页面对应单个不同的ViewModel,不会出现销毁了再次访问的问题。
  3. 定义一个方法调用notifyListener();作用仅仅是刷新界面。
  void refresh(){notifyListeners();}
  1. 在页面需要刷新的时候,不仅调用自身ViewModel的方法,而且调用对方的refresh方法(上面定义的),这样就能完成页面刷新。

试了之后很快就失败了(虽然功能成功了),ViewModel不能设计为单例模式,因为页面销毁后就会同时销毁ViewModel,这时候去访问就会直接报错。因此前面的探究全都没有用,不仅做法丑陋,结果也很丑陋。

未完待续……

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

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

相关文章

[计算机网络/Linux] 基于CENTOS7自建DNS服务

序最初的诉求:自建DNS,篡改公开网站的url为自建web服务的url。在使用浏览器进行网上冲浪的时候,我们只需要输入网址即可访问,但是在网络中,网址并不是一个有效的东西,真正起作用的是网址所对应的IP地址,但是IP地址是一堆没有规律的数字,难以记忆、使用,所以就有了DNS服…

[计算机网络] 基于CENTOS7自建DNS服务

序最初的诉求:自建DNS,篡改公开网站的url为自建web服务的url。在使用浏览器进行网上冲浪的时候,我们只需要输入网址即可访问,但是在网络中,网址并不是一个有效的东西,真正起作用的是网址所对应的IP地址,但是IP地址是一堆没有规律的数字,难以记忆、使用,所以就有了DNS服…

systemd[1]: home.mount: Directory /home to mount over is not empty, mounting anyway.

日志显示这些内容说明可能是 fstab 服务自动挂载之前 /home 不为空systemd[1]: home.mount: Directory /home to mount over is not empty, mounting anyway. ░░ Subject: 挂载点不为空 ░░ Defined-By: systemd ░░ Support: http://www.ubuntu.com/support ░░ ░░ 目…

Linux服务器上部署Redis流程

前言 Redis版本7.0.4 服务器版本:Linux CentOS 8.0 64位 1.下载Redis 进入官网找到下载地址 https://redis.io/download 进入到Xshell控制台(默认当前是root根目录),输入wget 将上面复制的下载链接粘贴上,如下命令: wget http://download.redis.io/releases/redis-7.0.4.tar…

[Tools] Buzz – 免费开源的AI语音转文字工具

Buzz 介绍 https://github.com/chidiwilliams/buzz Buzz是一款基于OpenAI Whisper模型构建的离线语音转文字工具,适用于Windows、macOS和Linux系统。Buzz能将麦克风输入或音频、视频文件实时转换为文字,支持多种格式导入导出,如TXT、SRT和VTT。Buzz的转换速度快,准确率高,…

Skipping题解(贪心,队列,迪杰斯特拉,思维)

原题链接 https://codeforces.com/problemset/problem/2023/B 大致题意 类似一个游戏游戏规则如下:从1开始,可以选择吃掉ai,之后只能选择比当前下标小的(明显,如果开始就选择吃掉a1,那么游戏就结束了)。 当然还可以选择不吃ai,那么可以跳到[1,b[i]](b[i]与i的大小关系…

arcpy开发初探

是第一次将软件操作和书写代码合二为一 一、配置环境 arcpy是无法pip下载到的,只有满足以下条件才能调用到: 1、运行代码时候需要使用arcgis下面的python做编译器去运行 2、arcmap是需要启动着的 先写个测试代码 import arcpy print(arcpy.GetInstallInfo()[Version]) input_…

2024-2025-1 20241322 《计算机基础与程序设计》第13周学习总结

2024-2025-1 20241322 《计算机基础与程序设计》第13周学习总结 作业信息这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK13这个作业的目标 《C语言程序设计》第12章并完…

全斗焕小曲 All In One

全斗焕小曲 All In One 挨棍的小曲 / 无限制格斗大赛の小曲 / 全斗焕の小曲 / 跑男の小曲 / 联赛开幕曲全斗焕小曲 All In One挨棍的小曲 / 无限制格斗大赛の小曲 / 全斗焕の小曲 / 跑男の小曲 / 联赛开幕曲demos https://search.bilibili.com/all?keyword=挨棍的小曲 https:/…

【项目学习】Morpho 借贷协议简单调研

项目背景 Morpho blue (下称 Morpho)是一个超额抵押借贷协议。与传统的借贷协议不同,Morpho 无需经过治理批准即可创建任意定制化的借贷市场。用户可以通过指定一项贷款资产、一项抵押资产、清算贷款价值 (LLTV)、预言机和利率模型 (IRM) 等参数来创建一个独立市场。市场创建…

01.大模型起源与发展

知识点注意力机制(Attention)的主要用途是什么?选择重要的信息并忽略不相关的信息Transformer 模型是基于什么理论构建的?C. 注意力机制(Attention)GPT 和 BERT 的主要区别是什么?C. GPT 使用了单向自注意力,而 BERT 使用了双向自注意力在注意力机制中,“Q”、“K”和…

IoTClient---基于C#开源的物联网设备通讯协议客户端

https://github.com/zhaopeiym/IoTClientIoTClient是一个物联网设备通讯协议实现客户端,将包括主流PLC通信读取、ModBus协议、Bacnet协议等常用工业通讯协议。本组件基于.NET Standard 2.0,可用于.Net的跨平台开发,如Windows、Linux甚至可运行于树莓派上。技术架构1. 编码语…