Flutter 状态管理引子

news2024/11/19 5:50:23

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包完成状态管理

主流

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

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

相关文章

AliOS-Things引入

目录 一、简介 1.1 硬件抽象层 1.2 AliOS-Things内核 rhino ​编辑 1.3 AliOS-Things组件 二、如何进行AliOS-Things开发 三、安装环境 安装python pip git 修改pip镜像源 安装aos-cube 一、简介 AliOS-Things是阿里巴巴公司推出的致力于搭建云端一体化LoT软件。AliOS-…

Linux操作系统--文件与目录结构

我们初步认识了Linux操作系统,下面我们进一步看看linux的文件与目录结构。 1.文件系统和挂载点 (1).当前的操作系统中查看文件系统 位置 > 计算机 这样你就可以看见当前操作系统中的所有目录和文件。如下所示: (2).挂载点 挂载点实际上就是linux中的磁盘文件系统的入口…

快速理解 X server, DISPLAY 与 X11 Forwarding

​ X server X server是X Window System (简称X11或者X)系统中的显示服务器(display server),用于监听X client发送来的图形界面显示请求,并且将图形界面绘制并显示在屏幕(screen)…

粒子群算法的基本原理和Matlab实现

1.案例背景 1.1 PSO算法介绍 粒子群优化算法(Particle Swarm Optimization,PSO)是计算智能领域,除了蚁群算法,鱼群算法之外的一种群体智能的优化算法,该算法最早是由Kennedy和 Eberhart 在1995年提出的。PSO算法源于对鸟类捕食行为的研究,鸟类捕食时,每只鸟找到食物最简单有效…

webassembly003 ggml GGML Tensor Library part-3

关于pthread_create()和pthread_join() #include <stdio.h> #include <pthread.h>void *thread_func(void *arg) {int *num (int *)arg;printf("Hello from thread! arg%d\n", *num);pthread_exit(NULL); }int main() {pthread_t thread;int arg 10;i…

解锁开发中的创意:用户为中心的设计思维的力量

引言 设计思维&#xff0c;起源于20世纪60年代&#xff0c;是一种解决问题的方法。它不仅仅是设计师的专利&#xff0c;而是一种可以广泛应用于各种行业和领域的方法。设计思维强调了用户至中的重要性&#xff0c;认为任何问题的解决都应该从用户的需求出发。这种方法鼓励我们…

反转链表+交换两个链表的节点

目录 ​编辑 一&#xff0c;反转链表 1.题目描述 2.例子 3.题目接口 4.分析以及解题代码 1.迭代法 2.递归写法 二&#xff0c;两两交换两个链表中的节点 1.题目描述 2.例子 3.题目接口 4.题目分析以及解法 一&#xff0c;反转链表 1.题目描述 首先来看看反转链表的…

主流深度学习框架及神经网络模型汇总

目录 主流深度学习框架及神经网络模型汇总 一、人工智能的研究领域和分支 二、主流深度学习框架​编辑 1.TensorFlow 2.PyTorch 3.PaddlePaddle 4.Keras 5.Caffe/Caffe2 6.MXNet 7.Theano 8.Torch 9.CNTK 10.ONNX 三、深度学习移动端推理框架 1.TensorRT 2.TF-…

LabVIEW是如何控制硬件的?

概述 工程 师 和 科学 家 可以 使用 LabVIEW 与 数千 种 不同 的 硬件 设备 无缝 集成&#xff0c; 并 通过 方便 的 功能 和 跨 所有 硬件 的 一致 编 程 框架 帮助 节省 开发 时间。 内容 通过更简单的系统集成节省开发时间 连接到任何硬件 NI 硬件 第三方硬件 快速找到…

数据库事务四大特性

事务的4大特性&#xff08;ACID&#xff09;&#xff1a; 原子性(Atomicity)&#xff1a; 事务是数据库的逻辑工作单位&#xff0c;它对数据库的修改要么全部执行&#xff0c;要么全部不执行。 一致性(Consistemcy)&#xff1a; 事务前后&#xff0c;数据库的状态都满足所有的完…

Python之defaultdict方法详解

文章目录 字典dict介绍collections.defaultdict类 字典dict介绍 python中的dict是一个重要的数据类型,用“键”(key)来索引&#xff0c;表示为dict(key: val, …),有以下特征&#xff1a; 键可以是任何不可变(immutable)数据类型不可变数据类型有&#xff1a;数字&#xff0c…

嵌入式软件设计

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

手写数字识别之损失函数

目录 交叉熵 手写数字识别之损失函数 分类任务的损失函数 Softmax函数 交叉熵的简单理解&#xff1a;真实分布与非真实分布的交叉&#xff0c;完全对应&#xff0c;熵为0 交叉熵的代码实现 交叉熵 给定一个策略, 交叉熵就是在该策略下猜中颜色所需要的问题的期望值。更普…

三、JVM监控及诊断工具-GUI篇

目录 一、工具概述二、jconsole&#xff08;了解即可&#xff09;1、基本概述2、启动3、三种连接方式4、作用 三、Visual VM 一、工具概述 二、jconsole&#xff08;了解即可&#xff09; 1、基本概述 从Java5开始&#xff0c;在JDK中自带的Java监控和管理控制台用于对JVM中内…

【mindspore学习】环境配置

本次实验搭配的环境是 CUDA 11.6 CUDNN v8.9.4 TensorRT-8.4.1.5 mindspore 2.1.0。 1、配置 Nvidia 显卡驱动 如果原来的主机已经安装了 nvidia 驱动&#xff0c;为避免版本的冲突&#xff0c;建议先清除掉旧的 nvidia驱动 sudo apt-get --purge remove nvidia* sudo apt…

土豆叶病害识别(图像连续识别和视频识别)

效果视频&#xff1a;土豆叶病害识别&#xff08;Python代码&#xff0c;pyTorch框架&#xff0c;视频识别&#xff09;_哔哩哔哩_bilibili 代码运行要求&#xff1a;Torch库>1.13.1&#xff0c;其它库无版本要求 1..土豆叶数据集主要包好三种类别&#xff08;Early_Blight…

分布式训练 最小化部署docker swarm + docker-compose落地方案

目录 背景&#xff1a; 前提条件&#xff1a; 一、docker环境初始化配置 1. 安装nvidia-docker2 2. 安装docker-compose工具 3. 获取GPU UUID 4. 修改docker runtime为nvidia&#xff0c;指定机器的UUID 二、docker-swarm 环境安装 1. 初始化swarm管理节点 2. 加入工…

Redis数据类型全总结【万字总结】

文章目录 前言一、String1、内部实现2、应用场景缓存对象常规计数分布式锁共享 Session 信息 3、常用指令 二、List1、内部实现2、应用场景消息队列List 作为消息队列有什么缺陷 3、常用指令 三、Hash1、内部实现2、应用场景缓存对象购物车 3、常用指令 四、Set1、内部实现2、应…

10万字智慧政务大数据平台项目建设方案222页[Word]

导读&#xff1a;原文《10万字智慧政务大数据平台项目建设方案222页[Word]》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 1.1 项目建设目标 推进市一级政府搭建数…

测试.net开源音频库NAudio

微信公众号“dotNET跨平台”看到一篇文章《【.NET】使用NAudio实现录音功能》介绍基于NAudio实现录音功能&#xff08;参考文献1&#xff09;。NAudio是开源.net音频库&#xff0c;其支持播放多种格式的音频&#xff08;WAV、AIFF、MP3、WMA等&#xff09;、音频格式转换、录音…