選型背景
首先我們的項(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)管理框架牛哺。