当前位置: 首页 > news >正文

Flutter 状态管理引子

1、为了更好地了解状态管理,先看看什么是状态。

在类似Flutter这样的响应式编程框架中,我们可以认为U相关的开发就是对数据进行封装,将之转换为具体的U1布局或者组件。借用Flutter官网的一张图,可以把我们在第二部分做的所有开发都抽象为下图所示的过程。

在这里插入图片描述

2、状态即为数据

Flutter框架通过build方法,將我们拥有的"数据”,也就是状态转换成了具体的页面内容,Fiutter官方将这些状态划分为了两种不同的类型:短时(ephemeral) 状态与应用(app)状态。所谓短时状态,是指包含在单个widget中且不会与其他widget共享的状态;应用状态则相反,是指会在多个Widget之间共享的状态。没太明白?没关系,这里我们只要理解"状态即为数据"就可以了。

3、响应式编程与命令式编程

传统的GUI编程框架(例如iOS的UIKit和 Android的SDK) 都属于命令式编程风格。所谓命令式编程,是指需要使用类似button.text=“hello world”
这样的方式来修改一个按钮上的文本。命令式编程的好处在于代码比较直观且易于理解,问题在于开发者很难将众多命令式的代码和实际的用户界面关联起来。而Flutter这种响应式编程框架很好地解决了这个问题,在响应式编程框架中,可以很容易地将代码与实际的用户界面关联起来(例如,Flutter中的build方法里的代码很容易就可以和实际的用户界面相关联),只是在响应式编程框架中,我们一般不会直接通过获取button对象的方式修改按钮上的文本,而是通过修改button对象对应的"状态"来修改,即框架替我们完成了修改状态后,更新button对象的工作。

4、维基百科-状态管理定义

〝状态管理指的是在图形用户界面中,对于和用户界面中类似文本框、按钮这样的组件所对应的状态的管理方式。,…尤其指代某个页面需要和其他多个页面共享状态的场景一一维基百科"

根据维基百科的定义,我们不难得出,状态管理面临的问题其实就是如何在复杂的页面中管理大规模,尤其是跨页面(或者说在Flutter中跨widget)的数据共享。从逻辑上讲,可以将Flutter中跨widget的状态共享分成下图中的三种情况。
在这里插入图片描述在状态管理的范畴中,解决widget之间状态共享问题的通用思路也很简单单一一提高状态的层级。也就是说,如果widget之间需要共享状态,就把这个状态提升到这两个widget的共同祖先widget中,将这个短时状态转变为应用状态。

4、结论

总而言之,得出这样一个结论:Flutter中状态管理所要解决的最根本的问题,就是如何在任意一个widget中获取某一个应用状态。接下来,我们会逐步分析如何在Flutter的框架体系中解决这个问题。

5、Flutter中的状态管理

在不引入任何新概念的前提下,要想从子Widget获取其父Widget中的状态,有以下两种简单的实现方式:

    1. 通过构造方法将父widget中的状态传递给子Widget;
    1. 把父widget的状态层级大幅度提高,使该状态成为一个全局的单例对象,在任何地方都可以获取到它。

6、5中的缺点

在业务逻辑比较简单的情况下,使用这两种方式都不会出现太多的问题,可是一旦业务逻辑变得复杂,这两种方式就有可能力不从心了。

  • 1.针对第一种方式,如果需要跨越多个层级传递数据,那么可以想象得到,对于整个层级的每一个widget中的构造方法,都需要添加对应的构造参数,需要跨越的层级越深,我们的代码就越丑陋。
  • 2.对于第二种方式,当需要共享的状态仅和个别页面相关联时,全局的单例对象会导致很多额外的开销。例如,我们可能只需要在某个子页面记录某个按钮是否可用,如果用一个单例对象存储按钮是否可用的状态,那么在页面被销毁后,还需要销毁单例对象中存储的对应状态对应,否则单例对象中会存在很多这样的无用状态。

以上两种方式,虽然在具体实现中都出现了问题,,但这些问题其实并不是方式方面的问题,而只是代码工程化方面的。
实际上,Flutter官方推荐的状态管理实现方式基本上就是基于这两种方式的工程化优化和实现。

7、原理

inheritedwidget和inheritedModel正是对第一种方式的工程化优化,Provider和Scoped Model则是对inherited widget的AP1封装,让我们能够少写一些重复度比较高的代码。BIoC仅仅是提供了一个组织逻辑代码和U代码的思路,其实际实现–flutter_bloc则是基于Provider包实现的。RxDart只是修改了B1oC中一部分
逻辑代码的编写方式,并没有在机制上逃出Inheritedwidget的范畴。Redux的层次和BIoC类似,只是给出了一个组织代码的方式和思路,它的一个实际实现一—fish_redux中也是利用inheriteawidget实现的。

8、如何使用Inherited Widget,和其原理

后续补充

9、使用Provider包完成状态管理

主流

相关文章:

Flutter 状态管理引子

1、为了更好地了解状态管理,先看看什么是状态。 在类似Flutter这样的响应式编程框架中,我们可以认为U相关的开发就是对数据进行封装,将之转换为具体的U1布局或者组件。借用Flutter官网的一张图,可以把我们在第二部分做的所有开发…...

CFC编程入门_【10分钟学会】

什么是CFC: 【差不多10分钟全学会】 CFC是图形化编程, 跟单片机的连线一样, 唯一的区别:功能块右侧是【只能输出】引脚。 只有左侧引脚可以输入输出。 有哪些控件: 指针:用于拖动功能块。 控制点&#xf…...

golang无需创建新切片

在 Go 语言中,append(b, 0)[:len(b)] 是一种常见的用法,用于在切片 b 后追加一个元素,并返回旧切片的前 len(b) 个元素。 这种用法的目的是将一个新元素追加到切片中,并确保切片的长度保持不变。具体步骤如下: 1. ap…...

Django基础5——ORM中间程序

文章目录 一、基本了解二、ORM基本操作2.1 连接数据库2.1.1 使用sqlite数据库2.1.2 使用MySQL数据库 2.2 对数据库操作2.2.1 增(前端数据——>数据库)2.2.2 查(数据库——>前端展示)2.2.3 改(修改数据&#xff0…...

SpringAOP详解(上)

当需要在方法前后做一些操作就需要借助动态代理来实现 一、动态代理实现方法 1、jdk自带实现方式 jdk实现代理是被代理类实现接口的方式 public interface UserInterface {void test(); }public class UserService implements UserInterface {public void test() {System.o…...

C++ 存储类

存储类定义 C 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。下面列出 C 程序中可用的存储类: autoregisterstaticexternmutablethread_local (C11) 从 C 17 开始,auto 关键字不再是 C 存储…...

【教程分享】Docker搭建Zipkin,实现数据持久化到MySQL、ES

1 拉取镜像 指定版本,在git查看相应版本,参考: https://github.com/openzipkin/zipkin 如2.21.7 docker pull openzipkin/zipkin:2.21.7 2 启动 Zipkin默认端口为9411。启动时通过-e server.portxxxx设置指定端口 docker run --name zi…...

数据库——MySQL高性能优化规范

文章目录 数据库命令规范数据库基本设计规范1. 所有表必须使用 Innodb 存储引擎2. 数据库和表的字符集统一使用 UTF83. 所有表和字段都需要添加注释4. 尽量控制单表数据量的大小,建议控制在 500 万以内。5. 谨慎使用 MySQL 分区表6.尽量做到冷热数据分离,减小表的宽度7. 禁止在…...

openapi中job提交

openapi中job提交 简介创建job查看job查看job 的描述查看job 的日志 镜像地址: https://www.jianshu.com/p/fcb3094f8c48?v1693020692471 简介 这里使用微软OpenPAI, 在nvidia的GPU设备上进行job测试。 创建job protocolVersion: 2 name: lenet_gpu_pytorch112_…...

Spring Boot 整合 分布式搜索引擎 Elastic Search 实现 数据聚合

文章目录 ⛄引言一、数据聚合⛅简介⚡聚合的分类 二、DSL实现数据聚合⏰Bucket聚合⚡Metric聚合 三、RestAPI实现数据聚合⌚业务需求⏰业务代码实现 ✅效果图⛵小结 ⛄引言 本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎,具备非常…...

深入探讨代理技术:保障网络安全与爬虫效率

在当今数字化时代,代理技术在网络安全与爬虫领域扮演着重要角色。从Socks5代理、IP代理,到网络安全和爬虫应用,本文将深入探讨这些关键概念,揭示它们如何相互关联以提高网络安全性和爬虫效率。 1. 代理技术简介 代理技术是一种允…...

【云原生】Docker私有仓库 RegistryHabor

目录 1.Docker私有仓库(Registry) 1.1 Registry的介绍 1.2 Registry的部署 步骤一:拉取相关的镜像 步骤二:进行 Registry的相关yml文件配置(docker-compose) 步骤三:镜像的推送 2. Regist…...

二叉树先序遍历的两种思路

二叉树先序遍历的两种思路 遍历思路 遍历二叉树首先判断一个节点应该做什么然后遍历左子树 遍历右子树 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int …...

小研究 - JVM 逃逸技术与 JRE 漏洞挖掘研究(一)

Java语言是最为流行的面向对象编程语言之一, Java运行时环境(JRE)拥有着非常大的用户群,其安全问题十分重要。近年来,由JRE漏洞引发的JVM逃逸攻击事件不断增多,对个人计算机安全造成了极大的威胁。研究JRE安…...

好用的可视化大屏适配方案

1、scale方案 优点&#xff1a;使用scale适配是最快且有效的&#xff08;等比缩放&#xff09; 缺点&#xff1a; 等比缩放时&#xff0c;项目的上下或者左右是肯定会有留白的 实现步骤 <div className"screen-wrapper"><div className"screen"…...

言有三新书出版,《深度学习之图像识别(全彩版)》上市发行,配套超详细的原理讲解与丰富的实战案例!...

各位同学&#xff0c;今天有三来发布新书了&#xff0c;名为《深度学习之图像识别&#xff1a;核心算法与实战案例&#xff08;全彩版&#xff09;》&#xff0c;本次书籍为我写作并出版的第6本书籍。 前言 2019年5月份我写作了《深度学习之图像识别&#xff1a;核心技术与案例…...

英特尔开始加码封装领域 | 百能云芯

在积极推进先进制程研发的同时&#xff0c;英特尔正在加大先进封装领域的投入。在这个背景下&#xff0c;该公司正在马来西亚槟城兴建一座全新的封装厂&#xff0c;以加强其在2.5D/3D封装布局领域的实力。据了解&#xff0c;英特尔计划到2025年前&#xff0c;将其最先进的3D Fo…...

基于大数据+django+mysql的学习资源推送系统的设计与实现(含报告+源码+指导)

本系统为了数据库结构的灵活性所以打算采用MySQL来设计数据库&#xff0c;而Python技术&#xff0c; B/S架构则保证了较高的平台适应性。文中主要是讲解了该系统的开发环境、要实现的基本功能和开发步骤&#xff0c;并主要讲述了系统设计方案的关键点、设计思想。 由于篇幅限制…...

CCF HPC China2023 | 盛大开幕,邀您关注澎峰科技

2023年8月24日&#xff0c;以“算力互联智领未来”为主题的第十九届全国高性能计算学术年会&#xff08;CCF HPC China 2023&#xff09;在青岛红岛国际会议展览中心拉开帷幕。特邀嘉宾涵盖行业大咖&#xff0c;主持阵容同样是“重量级”——来自国家并行计算机工程技术研究中心…...

【git进阶使用】 告别只会git clone 学会版本控制 ignore筛选 merge冲突等进阶操作

git使用大全 基本介绍git 快速上手一 环境安装&#xff08;默认已安装&#xff09;二 远程仓库克隆到本地1 进入rep文件夹目录2 复制远程仓库地址3 git clone克隆仓库内容到本地4 修改后版本控制4.1 修改文件4.2 git status查看版本库文件状态4.3 git add将文件加入版本库暂存区…...

【【萌新的STM32学习-16中断的基本介绍1】】

萌新的STM32学习-16中断的基本介绍1 中断 什么是中断 中断是打断CPU执行正常的程序&#xff0c;转而处理紧急程序&#xff0c;然后返回原暂停的程序继续执行&#xff0c;就叫中断 中断的作用 实时控制 &#xff1a; 就像对温度进行控制 故障控制 &#xff1a; 第一时间对突发情…...

ctfshow-红包题第二弹

0x00 前言 CTF 加解密合集CTF Web合集 0x01 题目 0x02 Write Up 同样&#xff0c;先看一下有没有注释的内容&#xff0c;可以看到有一个cmd的入参 执行之后可以看到文件代码&#xff0c;可以看到也是eval&#xff0c;但是中间对大部分的字符串都进行了过滤&#xff0c;留下了…...

C# winform中无标题栏窗口如何实现鼠标拖动?

文章目录 在C#中,可以通过重写窗体的鼠标事件来实现无标题栏窗体的拖动。 具体步骤如下: 禁用窗体的默认标题栏:在窗体属性中设置FormBorderStyle为None。 重写鼠标事件:在窗体类中重写MouseDown、MouseMove和MouseUp事件。 定义变量存储鼠标点击时的坐标。 在MouseDown事…...

【操作系统】各平台定时器粒度

文章目录 WindowsLinux Windows 在 Windows 操作系统中&#xff0c;定时器的精度取决于系统时钟的精度。通常情况下&#xff0c;Windows 系统时钟的精度为 15.6 毫秒&#xff08;即每秒钟约 64 次时钟中断&#xff09;&#xff0c;因此定时器的最小精度也是 15.6 毫秒。但是&a…...

抽象又有点垃圾的JavaScript

常数的排序 let x 10;let y 20;let z;if (x < y) {z x;x y;y z;}console.log(x, y);//x 20 ,y 10 通过一个媒介来继承x的初始值&#xff0c;然后将y的值赋值给x&#xff0c;再把媒介z的值赋值给y&#xff0c;达到排序 一个可重复使用的排序程序 第一种 function s…...

【Spring Boot】使用Spring Boot进行transformer的部署与开发

Transformer是一个用于数据转换和处理的平台&#xff0c;使用Spring Boot可以方便地进行Transformer的部署与开发。 以下是使用Spring Boot进行Transformer部署与开发的步骤&#xff1a; 创建Spring Boot项目 可以使用Spring Initializr创建一个简单的Spring Boot项目。在创…...

Qt应用开发(基础篇)——富文本浏览器 QTextBrowser

一、前言 QTextBrowser类继承于QTextEdit&#xff0c;是一个具有超文本导航的富文本浏览器。 框架类 QFramehttps://blog.csdn.net/u014491932/article/details/132188655 滚屏区域基类 QAbstractScrollAreahttps://blog.csdn.net/u014491932/article/details/132245486 文…...

JDBC:更新数据库

JDBC&#xff1a;更新数据库 更新记录删除记录 为了更新数据库&#xff0c;您需要使用语句。但是&#xff0c;您不是调用executeQuery()方法&#xff0c;而是调用executeUpdate()方法。 可以对数据库执行两种类型的更新&#xff1a; 更新记录值删除记录 executeUpdate()方…...

如何自定义iview树形下拉内的内容

1.使用render函数给第一层父级定义 2. 使用树形结构中的render函数来定义子组件 renderContent(h, {root, node, data}) {return data.children.length0? h(span, {style: {display: inline-block,width: 400px,lineHeight: 32px}}, [h(span, [h(Icon, {type: ios-paper-outli…...

技术的巅峰演进:深入解析算力网络的多层次技术设计

在数字化时代的浪潮中&#xff0c;网络技术正以前所未有的速度演进&#xff0c;而算力网络作为其中的一颗明星&#xff0c;以其多层次的技术设计引领着未来的网络构架。本文将带您深入探索算力网络独特的技术之旅&#xff0c;从底层协议到分布式控制&#xff0c;为您呈现这一创…...

广告设计主要做什么/网络营销的seo是做什么的

问题 题目&#xff1a;一个整型数组里除了两个数字之外&#xff0c;其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n)&#xff0c;空间复杂度是O(1)。 分析&#xff1a;这是一道很新颖的关于位运算的面试题。 首先我们考虑这个问题的一个…...

彩投网站建设/制作网站

BI是Business Intelligence(BI) 数据分析一般分为三个层面&#xff1a; &#xff08;1&#xff09;Memory内存分析层面 &#xff08;2&#xff09;BI分析层面 &#xff08;3&#xff09;Massive分析层面...

中山网站关键词排名/企业网站优化价格

概念&#xff08;来源于网络&#xff09;&#xff1a; clientX 设置或获取鼠标指针位置相对于窗口客户区域的 x 坐标&#xff0c;其中客户区域不包括窗口自身的控件和滚动条。 clientY 设置或获取鼠标指针位置相对于窗口客户区域的 y 坐标&#xff0c;其中客户区域不包括窗口自…...

淘宝做seo要建网站吗/大连中小企业网络营销

1.1 &#xff08;无效&#xff09;// 验证本地缓存的链接是否可以访问 // pathImg为链接 target为data中变量名的字符串getValidateImage (pathImg, target) {console.log(pathImg)var imgObj new Image()imgObj.src pathImgif ((imgObj.width > 0 && imgObj.hei…...

网站开发和网页设计的区别/百度一下 你就知道首页

自八月初立秋以来&#xff0c;很多地区出现了阴雨绵绵的天气&#xff0c;开车出行面临很多安全隐患。今天名悦集团来给大家聊聊秋雨季节开车有哪些安全隐患&#xff0c;出行有哪些注意事项&#xff0c;希望能帮到您。 挡风玻璃起雾&#xff0c;开暖风更严重 秋季阴雨天气开车…...

免费logo商标设计软件/seo外链平台热狗

春节前看到树莓派 2代开始销售&#xff0c;第一时间在淘宝下单购买&#xff0c;无奈春节期间放假&#xff0c;要到3月份才可能收到&#xff0c;只能用QEMU模拟器先熟悉树莓系统。对从turbo Pascal开始的人来讲&#xff0c;如果能在树莓系统使用Pascal那是最顺手的。上网发现Laz…...