Flutter redux 使用與理解

Flutter 狀態(tài)管理redux 方案理解與實(shí)踐

redux 數(shù)據(jù)管理方式來(lái)自 react 尉咕,React 的數(shù)據(jù)單向流通的叠蝇,很多時(shí)候需要共享數(shù)據(jù)的時(shí)候就比較麻煩,需要不斷地變量提升年缎,也就導(dǎo)致數(shù)據(jù)上溯會(huì)非常的混亂悔捶。解決辦法之一就是redux , 進(jìn)行全局統(tǒng)一的數(shù)據(jù)管理,并且通過(guò)State 的更新驅(qū)動(dòng)虛擬dom 更新单芜,再經(jīng)過(guò)diff 算法結(jié)果驅(qū)動(dòng)真實(shí)dom 的更新蜕该。優(yōu)勢(shì)是數(shù)據(jù)的結(jié)構(gòu)清晰,各個(gè)組件之間的數(shù)據(jù)共享。但是真的是挺繁瑣的洲鸠,初學(xué)者也不方便理解堂淡。

1.這是redux 數(shù)據(jù)流程圖,與一些關(guān)鍵組件扒腕。

一些基本概念的梳理:

Store:這是數(shù)據(jù)存儲(chǔ)倉(cāng)庫(kù)淤齐,保存所有的數(shù)據(jù)。其實(shí)在 react 里面是可以有多個(gè) store 的袜匿,我并沒(méi)有研究 ? ? ? ? flutter 里面是否可以存在多個(gè)更啄,但是正常來(lái)講一個(gè)已經(jīng)足夠了。并且建議一個(gè)應(yīng)用只配置一個(gè)Store 居灯。

Action: ?本質(zhì)就是一個(gè)個(gè)操作祭务,因?yàn)閞edux 是不允許直接操作 Store 里面的state 的落竹,Action 就相當(dāng)于一個(gè)的操作Store 請(qǐng)求文兢,。

reducer: 這是一個(gè)真真修改Store 里面State 的純函數(shù)窟赏。只有兩個(gè)參數(shù) 一個(gè)是當(dāng)前的State ,另一個(gè)是Action

Middleware: 中間件岩灭,主要是用來(lái)發(fā)起異步Action的拌倍,一般在這發(fā)起API ?請(qǐng)求,log 調(diào)試。 常用庫(kù)redux_thunk

Redux 接入實(shí)踐:

? ?在接入redux 時(shí)柱恤,我們需要接入一些其他的庫(kù)更方便的使用redux 数初,如:flutter-redux,redux_thunk等梗顺。

?flutter-redux?具備除了redux的所有能力之外泡孩,針對(duì)UI層專門(mén)提供了StoreProvider、StoreConnector寺谤、StoreBuilder等相應(yīng)的操作組件仑鸥,這大大簡(jiǎn)化了我們?cè)趂lutter中使用redux的成本。redux_thunk 可以讓我們像發(fā)起普通Action一樣去發(fā)起 異步Action.后面我們會(huì)介紹 這些關(guān)鍵Widget 的作用变屁。

Step1 創(chuàng)建一個(gè)全局的Store 并接入到App 中眼俊,創(chuàng)建 Store 時(shí) middleware 參數(shù)需要注意一下,當(dāng)我們引入redux_thunk 這在數(shù)組中直接 加入thunkMiddleware 就好了粟关。 StoreProvider?是flutter_redux 提供的UI widget 疮胖,包裹MaterialApp根組件,在程序入口綁定好創(chuàng)建的全局的store 誊役。


step1

Step2 創(chuàng)建并初始化一個(gè)全局的State 用來(lái)保存全局的數(shù)據(jù)获列。Store 創(chuàng)建的時(shí)候就傳入了一個(gè) AppState 的泛型。以后存取數(shù)據(jù)都需要用到這個(gè)State 實(shí)體蛔垢。


Step2_圖1


step2_圖2

Step3 創(chuàng)建Action ,比如我需要調(diào)用查詢單詞的接口击孩,這是一個(gè)異步的Action ?,我們就需要用到Middleware 了鹏漆。那么我們先創(chuàng)建一個(gè)?Middleware巩梢。ThunkAction 類(lèi)型是一個(gè) Store 參數(shù)的異步函數(shù),我們要傳遞參數(shù)只能像如圖調(diào)用艺玲。第一ThunkAction 是真正API 請(qǐng)求括蝠,第二 ThunkAction 是一個(gè)測(cè)試。redux_thunk 會(huì)自己把ThunkAction 放入到中間件饭聚,我們只需要當(dāng)普通Action 調(diào)用就行了忌警。Step3_圖2 就是定義的普通的Action


Step3_圖1


Step3_圖2

Step4 ?發(fā)起Action , 去執(zhí)行 reducer , ThunkAction 與普通action 執(zhí)行時(shí)一樣的,都是dispatch 一個(gè)action 出去秒梳。不過(guò)在發(fā)起 Action 前 我們需要先 connect 一下法绵,把當(dāng)前組件跟Store 綁定起來(lái)。StoreConnector 組件就是用來(lái)關(guān)聯(lián)Store 與當(dāng)前組件酪碘,當(dāng)Store 發(fā)生改變的時(shí)候朋譬,接受 新的 State 。OnInit ?內(nèi)可以執(zhí)行初始化操作兴垦, converter 方法轉(zhuǎn)換成 viewMode, builder 兩個(gè)參數(shù)徙赢,一個(gè)是組件的上下文字柠,一個(gè)是State 在這邊把state 轉(zhuǎn)化成UI 。var store = StoreProvider.of<AppState>(context);用來(lái)獲取 當(dāng)前組件綁定的Store 狡赐。其實(shí) 一般來(lái)講全局就一個(gè)store 對(duì)象窑业,可以 保存在全局配置中,也就不需要每次用的時(shí)候都獲取了阴汇。


Step4_圖1
Step4_圖2

Step5 創(chuàng)建 Reducer 数冬,reducer 是純函數(shù)节槐,只有兩個(gè)參數(shù) :當(dāng)前的的State 和 執(zhí)行的action 搀庶,并根據(jù)action 來(lái)修改State .在這里不應(yīng)該做其他的操作。這個(gè)沒(méi)有 react ?{...state} 解包方式铜异,我這邊沒(méi)有仔細(xì)寫(xiě)哥倔,讀者可以根據(jù)需要在 MineState 中寫(xiě)一個(gè) 方法,可以優(yōu)雅的操作state.


Step5

Step6 使用Store State揍庄。在connector 中就已經(jīng)可以拿到Store 對(duì)象咆蒿,我們就可以愉快的使用Store State?


Step6

總結(jié):Redux ?是挺繁瑣的,但是基本結(jié)構(gòu)整理清晰后蚂子,后面的套路都一樣的沃测,一些基礎(chǔ)結(jié)構(gòu)搭建好,再經(jīng)過(guò)打磨后食茎,用起來(lái)還是很方便的蒂破。不過(guò)初學(xué)者要好好整理一下redux 的數(shù)據(jù)流向,弄清楚一些 flutter_redux 的基礎(chǔ)組件的作用别渔。

寫(xiě)了一個(gè)demo 供大家參考一下:github 地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末附迷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子哎媚,更是在濱河造成了極大的恐慌喇伯,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拨与,死亡現(xiàn)場(chǎng)離奇詭異稻据,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)买喧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)捻悯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人岗喉,你說(shuō)我怎么就攤上這事秋度。” “怎么了钱床?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵荚斯,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)事期,這世上最難降的妖魔是什么滥壕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮兽泣,結(jié)果婚禮上绎橘,老公的妹妹穿的比我還像新娘。我一直安慰自己唠倦,他們只是感情好称鳞,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著稠鼻,像睡著了一般冈止。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上候齿,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天熙暴,我揣著相機(jī)與錄音,去河邊找鬼慌盯。 笑死周霉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的亚皂。 我是一名探鬼主播俱箱,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼孕讳!你這毒婦竟也來(lái)了匠楚?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤厂财,失蹤者是張志新(化名)和其女友劉穎芋簿,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體璃饱,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡与斤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了荚恶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撩穿。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖谒撼,靈堂內(nèi)的尸體忽然破棺而出食寡,到底是詐尸還是另有隱情,我是刑警寧澤廓潜,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布抵皱,位于F島的核電站善榛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏呻畸。R本人自食惡果不足惜移盆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伤为。 院中可真熱鬧咒循,春花似錦、人聲如沸绞愚。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)爽醋。三九已至蚁署,卻和暖如春便脊,著一層夾襖步出監(jiān)牢的瞬間蚂四,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工哪痰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留遂赠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓晌杰,卻偏偏與公主長(zhǎng)得像跷睦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肋演,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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