為啥要使用Fish redux
1,年前就被閒魚大佬安利,種草已久
2,想要對比Flutter Redux,學習體會它帶來的優越性
3,參與並支援一下國產,現在Flutter生態還在早期
準備工作
1,Redux.js 文件
2,Fish Redux 文件
3,Pub使用文件
萌新(沒接觸過Redux):建議按順序看一遍,磨刀不費砍柴功,紮實的理論基礎是很有用處的
熟練玩家(Demo用過Redux):建議把Fish Redux文件的簡介和Component看下,尤其是Component,這是它獨特的地方
老司機(專案中用過Redux.js或Flutter Redux):可以重點看下Component中的Effect,Dependencies,Page,還有Adapter
在看文件時,可以把Fish Redux專案Clone下來,先把Example改下跑跑看,再對著原始碼理解下文件中的概念。
重要概念
當然以下概念還是需要理解的:
Action
Action定義一種行為,可以攜帶資訊,發往Store。換言之Store發生改變須由Action觸發,Fish redux 有以下約定:Action 包含兩個欄位type和payload;推薦寫法是在action.dart裡定義一個type列舉類和一個ActionCreator類,這樣有利於約束payload的型別。
Reducer/Effect
這兩個函式都是用來處理資料的函式,Reducer是純函式響應Action對Store資料進行改變。Effect用來處理來自檢視的意圖,如點選事件,發起非同步請求,這些有副作用的操作。
Page
可以看成是一個容器,它用來配置聚合State,Effect,Reduce,View,Dependencies等
- 一個頁面內都有且僅有一個 Store(意思是會有好多個Store,這是區別於Flutter Redux的)
- Page 繼承於 Component,所以它能配置所有 Component 的要素(意思是比Component多了Middleware和initState)
- Page 能配置 Middleware,用於對 Redux 做 AOP 管理(意思是可以無侵入的實現一些如log列印,效能分析這樣的通用功能。中介軟體定義是可插拔,可疊加,但不會改變事件流程)
- Page 必須配置一個初始化頁面資料的初始化函式initState(頁面有初始資料是必須的吧)
Adapter(可選)
這個不是必須,但確實很屌,很好用,使用和Android的老配方差不多,妙在效果拔群。有追求的可以看下歷史和原理,當然還有原始碼。
有這些儲備,那麼可以開始寫程式碼了
接入
1,建立一個flutter project,按照文件加入依賴
2,按照定義(當然也可以對著Example)分別建立Action,State,Effect,Reducer,View,Page這幾個檔案,並寫套路程式碼。
3,執行程式碼觀察效果
個人體驗
1,集中,分治
Fish Redux完整復刻了Redux.js的核心概念,狀態是一顆State樹,完整體現[Predictable],[Centralized],[Debuggable],[Flexible],資料狀態是由Redux集中管理的。分治是分而治之,把一個大的問題拆解成若干獨立的小問題去解決,比如Effect的實現和Component的封裝,一個頁面可以由多個Component和Effect共同組成,分治帶來的一個額外好處是提高了內聚性和可複用性。
2,Adapter
個人認為這是閒魚團隊基於現實業務的一個很重要創造,Listview可以佔到一個應用的50%以上介面,它的體驗至關重要。事實證明Adapter封裝的很友好,效能也很突出,在Demo上就可以明顯對比出來,很妙。
3,文件
這點是可以理解一下的,畢竟剛開源。現狀是註釋少,好多模組還沒有。文件有,但不太具體生動,友好,讀者沒帶入容易字都認識,但看幾遍還不解其意。
問題
1,Fish Redux 一個頁面一個Store的資源開銷?
用Observatory檢視,單個例項引用並不大,而且退出頁面store例項被回收,理論上資源比flutter redux還少一點。
2,Store的生命週期,應用的一些長期共用資料怎麼維護?
可以用createStore建立一個store作為單例維護,參考。
本文原始碼地址:https://github.com/hyjfine/flutter_redux_sample/tree/fish-redux-adapter
(完)
@子路宇, 本文版權屬於再惠研發團隊,歡迎轉載,轉載請保留出處。