Flutter分享 : 状态管理

状态管理

了解前面的知识,就可以简单开发些小项目了,但是如果想要构建稍微复杂点的项目就不得不了解“状态管理”的概念,“状态管理”这是一个来自前端开发的名词,简单的来说当你问一个前端项目如何进行状态管理时,就等于问这个项目是如何设计的一样。

简介

因为,React、Vue等前端框架大行其道,响应式编程的理念也随之流行,在具体的项目中描述好UI和状态之间的关系后,我们只需要专注于状态的改变就好了,而框架将会根据我们的描述,自动根据状态来更新UI。不像在Android端常见的命令式编程,需要我们手动去指定控件展示的内容。


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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容