Flutter狀態(tài)管理框架選型報(bào)告

選型背景

首先我們的項(xiàng)目是學(xué)習(xí)型項(xiàng)目赵刑,盡可能的考慮實(shí)際生產(chǎn)場景中團(tuán)隊(duì)開發(fā)遇到的問題,并最大程度去解決存在的問題丑慎。

使用Flutter之后进副,普遍反饋是書寫舒服,和原生相比不需要多個(gè)類的交互皆辽,在一個(gè)dart文件里鼓蜒,以函數(shù)式的編程冯痢,輕松布局油狂,UI和邏輯之間的關(guān)系也更好理解。但隨之而來的問題是:代碼可讀性差、代碼可復(fù)用度低再层、沒有統(tǒng)一的代碼規(guī)范碗旅、UI代碼業(yè)務(wù)代碼耦合度高医瘫!這就非常難受了吼具,對于團(tuán)隊(duì)開發(fā)而言毅整,極大的影響開發(fā)效率悼嫉,而且耦合會帶來可修改性變差的問題鲁纠,所以我們需要有個(gè)像MVP、MVVM那樣成熟的框架幫我們規(guī)范書寫格式。且Flutter有一個(gè)狀態(tài)管理的問題疗隶,面對幾十上百個(gè)狀態(tài),我們需要對狀態(tài)進(jìn)行一個(gè)同步和代碼的復(fù)用,不能每個(gè)頁面都寫一個(gè)類文件叭艰猬!類似Model和模版頁的關(guān)系横堡。

框架選型

經(jīng)過了解,主流的框架有:BLoC冠桃、Flutter-Redux命贴、Flutter-provide、Fish-Redux。

BLoC

Business Logic Component胸蛛,BLoC污茵,由谷歌開發(fā)推出,它的思路是把UI和邏輯分離葬项,并且UI可以分得很細(xì)泞当,整個(gè)方案由一定的分治關(guān)系;但是邏輯是統(tǒng)一的民珍,這樣做的優(yōu)點(diǎn)邏輯和UI分離零蓉、便于測試、一定的邏輯重用穷缤。缺點(diǎn)沒有辦法對邏輯做更進(jìn)一步的分治敌蜂,雖然UI可以分治,但是邏輯的不可分治問題會隨著業(yè)務(wù)邏輯的增大而復(fù)雜津肛,最終變得龐大而難以管理章喉。

Flutter-provide

這也是谷歌推出的狀態(tài)管理方案,Provider被設(shè)計(jì)為ScopedModel的替代品身坐,并且允許我們更加靈活地處理數(shù)據(jù)類型和數(shù)據(jù)秸脱。但這種管理,只是借助了InheritWidget部蛇,將共享狀態(tài)放到頂層MaterialApp之上摊唇。底層部件通過Provier獲取該狀態(tài),并通過混合ChangeNotifier通知依賴于該狀態(tài)的組件刷新涯鲁。并沒有對數(shù)據(jù)進(jìn)行組織巷查,對職責(zé)進(jìn)行劃分,僅僅達(dá)到狀態(tài)共享的作用抹腿。適用于簡單應(yīng)用的狀態(tài)管理岛请。

Flutter-Redux

Flutter-Redux這個(gè)方案還是由谷歌推出的,它與前端熟知的ReactJS社區(qū)里的Redux方案幾乎一致警绩,但是基于 Dart 和 JS 語言上的差異崇败,它沒有做到把一個(gè)Reducer 變成若干個(gè)Reducer一層層分治的效果。它有唯一的一個(gè)store肩祥,直接對應(yīng)下面的view后室,通過action的形式將數(shù)據(jù)流驅(qū)動(dòng)起來,優(yōu)點(diǎn)很明顯混狠,就是集中的數(shù)據(jù)管理岸霹、方便觀察并且容易調(diào)試,并且有Middleware中間件機(jī)制更加相對容易拓展檀蹋。但缺點(diǎn)把數(shù)據(jù)和邏輯集中了松申,但是很難把這一塊的東西分治出來云芦,在龐大復(fù)雜的業(yè)務(wù)中更應(yīng)該將UI和數(shù)據(jù)邏輯分離開來,不能只是將UI分治了贸桶,而邏輯還混在一起舅逸,如果這樣也會導(dǎo)致最終項(xiàng)目難以維護(hù)。

Fish-Redux

Fish-Redux 是閑魚團(tuán)隊(duì)基于 Redux 做的一次量身改良皇筛,通過 Redux 做集中化的可觀察的數(shù)據(jù)管理琉历。FR 是一個(gè)基于 Redux 數(shù)據(jù)管理的組裝式 flutter 應(yīng)用框架, 特別適用于構(gòu)建中大型的復(fù)雜應(yīng)用水醋,對于傳統(tǒng) Redux 在使用層面上的兩大缺點(diǎn)做了重大改良旗笔,具體做法是:首先規(guī)定一個(gè)組件需要定義一個(gè)數(shù)據(jù)(State)和一個(gè) Reducer,同時(shí)組件之間存在著父依賴子的關(guān)系拄踪。通過這層依賴關(guān)系去解決了 集中和分治之間的矛盾蝇恶,而對 Reducer 的手動(dòng)層層 Combine 變成由框架自動(dòng)完成,使之簡化了使用 Redux 的困難惶桐,同時(shí)也得到了理想的集中的效果和分治的代碼撮弧。也就是說,Fish Redux在狀態(tài)管理之余姚糊,還做到了對數(shù)據(jù)的集中和邏輯的分治贿衍,支持頁面級別數(shù)據(jù)池,并對代碼文件做到了清晰的職責(zé)劃分救恨,有利于團(tuán)隊(duì)協(xié)作形成統(tǒng)一的代碼規(guī)范贸辈。

Fish Redux 最顯著的特征是函數(shù)式的編程模型、可預(yù)測的狀態(tài)管理肠槽、可插拔的組件體系擎淤、最佳的性能表現(xiàn)。它的特點(diǎn)是配置式組裝署浩。一方面我們將一個(gè)大的頁面揉燃,對視圖和數(shù)據(jù)層層拆解為互相獨(dú)立的 Component|Adapter,上層負(fù)責(zé)組裝筋栋,下層負(fù)責(zé)實(shí)現(xiàn);另一方面將Component|Adapter 拆分為 View正驻,Reducer弊攘,Effect 等相互獨(dú)立的上下文無關(guān)函數(shù)。優(yōu)點(diǎn)是非常干凈姑曙,易于維護(hù)襟交,易于協(xié)作,將集中伤靠、分治捣域、復(fù)用、隔離做的更進(jìn)一步,缺點(diǎn)就是代碼量的急劇增大(而且是非常非常非常急劇增大)焕梅。以我們項(xiàng)目為例迹鹅,配置頁面如下:

選擇Fish-Redux的理由

  • Fish Redux是對Redux的改良,突出優(yōu)點(diǎn)是做到了數(shù)據(jù)的集中和邏輯的分治贞言,并支持頁面級別數(shù)據(jù)池斜棚,配置式自動(dòng)組裝使得代碼非常靈活,這是其他框架不具備的该窗。

  • Fish Redux代碼寫起來非常干凈弟蚀、易維護(hù),清晰的代碼職責(zé)劃分有利于團(tuán)隊(duì)協(xié)作代碼風(fēng)格統(tǒng)一酗失,這種邏輯清晰义钉、條理清楚的感覺就很舒服。

  • Fish Redux 還提供了一個(gè) Adapter 的抽象組件模型规肴,在基礎(chǔ)的組件模型以外断医,F(xiàn)ish Redux 提供了一個(gè) Adapter 抽象模型,用來解決在 ListView 上大 Cell 的性能問題奏纪。通過上層抽象鉴嗤,可以得到了邏輯上的 ScrollView,性能上的 ListView序调。我們項(xiàng)目多列表展示醉锅,最重要的組件就是ListView,F(xiàn)ish Redux的這個(gè)特點(diǎn)非常契合我們項(xiàng)目的需求发绢。

  • 雖然Fish Redux學(xué)習(xí)成本高硬耍,使用較為復(fù)雜,小型項(xiàng)目沒有必要使用边酒。但我們是一個(gè)學(xué)習(xí)型項(xiàng)目经柴,知難而上是一件很有意思的事,這正是學(xué)習(xí)的意義所在墩朦。我們項(xiàng)目功能不復(fù)雜坯认,對Fish Redux帶來的代碼量增大可以接受。

    綜上氓涣,我們最終選取了Fish-Redux作為我們的狀態(tài)管理框架牛哺。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市劳吠,隨后出現(xiàn)的幾起案子引润,更是在濱河造成了極大的恐慌,老刑警劉巖痒玩,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淳附,死亡現(xiàn)場離奇詭異议慰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)奴曙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門别凹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缆毁,你說我怎么就攤上這事番川。” “怎么了脊框?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵颁督,是天一觀的道長。 經(jīng)常有香客問我浇雹,道長沉御,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任昭灵,我火速辦了婚禮吠裆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烂完。我一直安慰自己试疙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布抠蚣。 她就那樣靜靜地躺著祝旷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嘶窄。 梳的紋絲不亂的頭發(fā)上怀跛,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機(jī)與錄音柄冲,去河邊找鬼吻谋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛现横,可吹牛的內(nèi)容都是我干的漓拾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼长赞,長吁一口氣:“原來是場噩夢啊……” “哼晦攒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起得哆,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哟旗,沒想到半個(gè)月后贩据,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體栋操,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年饱亮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了矾芙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡近上,死狀恐怖剔宪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情壹无,我是刑警寧澤葱绒,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站斗锭,受9級特大地震影響地淀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜岖是,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一帮毁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧豺撑,春花似錦烈疚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至屹电,卻和暖如春阶剑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背危号。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工牧愁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人外莲。 一個(gè)月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓猪半,卻偏偏與公主長得像,于是被迫代替她去往敵國和親偷线。 傳聞我的和親對象是個(gè)殘疾皇子磨确,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容