推广

Flutter分享 : 状态管理

iseeyu3年前 (2024-02-21)推广132

UI=f(State)

Flux、Redux、Fish_Redux

对于如何理解“状态管理”这个概念我还是想以追本溯源的方式来解释给大家听,首先,当前我们使用Flutter开发的项目用到的状态管理框架是阿里巴巴咸鱼团队开源的Fish_Redux, 而Fish_Redux的基本思想又是来源于React技术栈下的Redux,从Redux再往前推就是最初与React一同登场的Flux。

yNjidg.png

Flux : 缘起

在没有Flux和React之前,Facebook的工程师一直被一个小bug困扰

Facebook消息提示

一般社交类产品除了主屏上的动态列表,通常还会在明显的位置摆放一个查看消息的入口,这个入口上会有小红点表示当前有多少条未读消息。

yNjFoQ.png

当时有些用户发现在使用Facebook的过程中消息入口上有小红点,但是点击进消息列表却没有未读消息的情况。用户看到红点进入消息页没有未读消息,小红点消失,过一会儿小红点再次出现,进入消息页依旧没有未读消息。就这样循环往复,开发团队也是在修复bug再次出现这个bug中循环往复。

不可预测的MVC

我们先来看看当时当时Facebook项目的架构,对于小型项目来说的MVC模型,看起来似乎还挺可靠的

yUSt4e.jpg

但是随着业务量的增大,MVC的问题越来越明显,依赖关系和各种层级的更新经常在大型MVC应用程序中发生,从而导致数据流错综复杂和不可预期的结果,前面的bug也是在这样的项目结构下,出现循环引用而导致的。

yNjAij.png

解决方案

为此,facebook的工程师打算将项目架构推倒重来,目标是为了更快的开发效率和更高的代码质量,为了做到这两点需要的是可预测的代码,也就因此最后分别开发出了响应式UI框架React来达到UI的可预测,状态管理框架Flux达到数据的可预测。

yNjEJs.png

Flux

Action是由ActionCreators提供给Dispactcher,通常是由用户与视图的交互产生的
Dispactcher将会根据Action的类型来通知Store触发页面初始化时在Store中注册的回调
Store响应Dispactcher的请求对其内所维护的状态进行相关操作,操作完成后将会通过Event Handler告诉View有数据发生改变
View监听到数据改变并从Event Handler中获取对应的数据以此来刷新UI

yNjVWn.png

Redux : 优化Flux

在Flux发布之后一段时间里Dan Abramov看到了可以优化Flux的可能,于是就基于Flux创造出了Redux

Redux在Flux的基础上做出了一些改进,在Flux中Store包含了状态改变的逻辑和当前应用的状态,而在Redux中将Store的两个部分拆分为处理状态改变逻辑的Reducer和状态State,在Flux中没有提供给开发则监听单向数据流的拓展,而Redux将Dispactcher改名为Dispatch,并在其中提供了用于监听数据流拓展接口。Redux具体流程和Flux类似,其中需要注意的是Reducer响应Dispatch时不仅会收到Action的信息还会有当前状态的拷贝,Reducer对拷贝的状态操作完成后,传递给State并由此更新。

yNjZzq.png

Redux特性

通过对Flux的优化,Redux得到了更便捷的热重载,可以回退应用状态的时间旅行,以及可以监控单向数据流的拓展接口

热重载:在开发应用程序时,通常是一个接一个的小改动。您看到较小更改的效果的速度越快,开发就会越快。热重载的优点在于,可以实时的将修改的逻辑代码更新到应用中,而应用程序的状态却不会重置。虽然React配合Flux也可以热重载,但是因为Store中包含了应用状态和逻辑代码,如果对Store的代码热重载将会丢失当前的状态。在Redux中将Store拆分后,即可对操作状态的逻辑代码进行热重载了。

时间旅行:通过拷贝状态的方式,可以得到一连串的状态切片,每个切片又由对应的Action触发,有了这些切片,我们在调试程序的过程中,可以进行时间回溯,重新加载出现错误时的前一个状态。例如,在测试的过程中执行了某个操作导致出现异常,我可以回退到上一步,重新来一次。

可拓展接口:可以通过Dispatch监听所有经过它的Action,可以用来打印日志,用来埋点等等。

yNjuLT.png

Fish_Redux:适配Flutter

Fish Redux 基于Redux在Flutter端的状态管理框架。将Redux中的Reducer再区分出了一个Effect

因为Flutter编译的发布包是AOT,代码中不支持反射、Hook等操作,所以无法判断Reducer处理完成后的状态是否有更新,因此需要将不做状态更新的代码显式的移到Effect中去执行,这样也是为了不让UI刷新过于频繁,影响性能。

yNjnyV.png

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/57254.html

相关文章

引爆全网16.7亿+流量,拆解凯迪仕爆品营销策略玩法

引爆全网16.7亿+流量,拆解凯迪仕爆品营销策略玩法

“在注意力稀缺和信息碎片化的时代,需要为消费者创造 Wow Moment(惊叹时刻)。”被誉为“现代学之父”的菲利普·科特勒在其著作《营销4.0:从传统营销到数字营销》中如此写到。诚然,在营销时,品牌都希望有一个足以引爆全网的idea,但关键是,这个引爆点要和目标消费者产生...

小编分享网站的站点收录率是什么。

小编分享网站的站点收录率是什么。

如果几乎全部的网页都被所有搜索引擎收录,那就不用在花什么功夫了,但大多数的收录率远远低于100%——有些甚至在5%以下,那么怎样能使更多的网页被收录呢? 收录率 = 网站被收录的网页的数量 / 网站所有的网页数量 1、怎么测定站点网页总数? 在开始统计网页的任务时,要记住应该只统...

小编教你如何在网上推广自己的产品(如何在网上推广自己的公司)

小编教你如何在网上推广自己的产品(如何在网上推广自己的公司)

如何在网上推广产品?现如今,互联网形式到来给许多人带来契机,一些电商企业也利用互联网这样的平台推广自己的产品,那么,我们该怎么推广自己的平台吗? 1、利用好网站内的收费推广。在很多网站上开的话,网站本身提供了一些广告宣传方式,如粗体显示、图片橱窗、首页推荐位展示等,这些服务通常是收费的,但是可以为...

淘宝开店营业执照怎么办,淘宝代办营业执照(淘宝网店营业执照办理流程)

淘宝开店营业执照怎么办,淘宝代办营业执照(淘宝网店营业执照办理流程)

新开店铺还没有成交记录,超过零星小额标准才属市场主体登记的范围,或您属于《电商法》规定的其他不需进行市场主体的类型,亦不需要进行登记。但如您销售的商品或提供的服务属需取得行政许可才能经营的(如:食品),则需要进行市场主体登记,并取得相应行政许可。...

网页加载速度是SEO优化的首要任务。

网页加载速度是SEO优化的首要任务。

图片是每个网站基本都少不了的东西,但是对于做视频、音频的站点来说,如果打开页面就自动播放,占用的网站带宽资源都更多了,所以这也是一个网站打开速度优化的一个小知识。 所有的搜刮引擎排名与网站的加载速率或多或少有些瓜葛,而此次baidu闪电算法来了,将网站首屏关上速率被参加优化排名队列,并明确指定关上...

新手做网站SEO时要掌握的55个优化技巧。

新手做网站SEO时要掌握的55个优化技巧。

SEO优化是一种结合技术,分析和创新的过程,旨在提高网站在搜索引擎中的知名度。SEO的主要功能是吸引更多免费的自然流量到站点。今天我们汇总了55个SEO技巧帮助您自己创建成功的SEO友好网站。下面来和小编一起看一看吧! 1.向您的网站添加100%高质量的独特内容 2. 创建优先考虑页面...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片