Flutter狀態(tài)管理總結(Provider&Get)

前言:不同狀態(tài)管理框架的解決思路不一樣,從實現(xiàn)上可以分為兩大類:

  • 通過 Flutter 樹機制 解決,例如 Provider糯俗;
  • 通過 依賴注入顶霞,例如 Get肄程。
名稱 基本原理
Provide 依賴樹機制,必須基于 context选浑,提供了子組件訪問上層的能力
Get 全局單例蓝厌,任意位置可以存取存在類型重復,內(nèi)存回收問題

一古徒、Provide

基本原理:Flutter 在 BuildContext 類中為我們提供了方法進行向上和向下的查找拓提,provider 正是借助這種樹機制,完成了 View -> Presenter (控制器)的獲取隧膘。所以每次用 Provider 的時候你都會調(diào)用 Provider.of<T>(context)代态。顯然,所有 Provider 以下的 Widget 節(jié)點疹吃,都可以通過自身的 context 訪問到 Provider 中的 Presenter蹦疑,這很好的解決了跨組件的通信問題。
Provider詳細分析傳送門

image.png

二萨驶、Get

1歉摧、原理分析

樹機制很不錯,但他依賴于 context,如果層級比較多叁温,會很讓人抓狂再悼。get 通過依賴注入的方式,實現(xiàn)了對 Presenter(控制器) 層的獲取券盅。簡單來說帮哈,就是將 Presenter 存到一個單例的 Map 中,這樣的好處就是在任何地方都可以獲取到锰镀,十分的靈活方便娘侍,省去了Provide繁雜的中間層處理。

2泳炉、單利遇到的問題

全局單例存儲一定要考慮到 Presenter 的回收憾筏,不然很有可能引起內(nèi)存泄漏。使用 get 要么你手動在頁面 dispose 的時候做 delete 操作花鹅,要么你使用 GetBuilder 氧腰,其實它里面也是在 dispose 去做了釋放。一般情況下刨肃,我們會使用GetBuilder古拴。

@override
void dispose() {
  super.dispose();
    if (widget.autoRemove && GetInstance().isRegistered<T>(tag: widget.tag)) {
      // 移除 Presenter 實例
      GetInstance().delete<T>(tag: widget.tag);
    }
}
3、為什么使用 Provider 的時候不需要考慮這個問題真友?

重點:這是因為一般頁面級別的 Provider 總是跟隨 PageRoute黄痪。隨著頁面的退出,整樹中的節(jié)點都被會回收盔然,所以可以理解為系統(tǒng)機制為我們解決了這個問題桅打。

4、Get相對Provider的優(yōu)勢
4.1 Provider 中我們通過 context實現(xiàn)跨組件訪問數(shù)據(jù)愈案,Provider要想實現(xiàn)跨頁面訪問那么 Provider 的存儲節(jié)點需要放在一個更高的位置挺尾,但同樣需要注意回收的處理。
4.2 Get 因為是全局單例站绪,無論是跨頁面或者跨組件遭铺,都沒有任何依賴。所以崇众,Get的使用更加快捷掂僵、方便。所以顷歌,在多個跨組件業(yè)務中更加推薦使用Get锰蓬,擺脫Provider的context依賴。
5眯漩、控制刷新范圍
5.1 get 的 Obx 組件使用極為方便簡潔芹扭,調(diào)用如下:
class Home extends StatelessWidget {
  var count = 0.obs;
  @override
  Widget build(context) => Scaffold(
      body: Center(
        child: Obx(() => Text("$count")),
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: () => count ++,
      ));
}
5.2 分析起來就三步
/// 申明變量麻顶,進行obs監(jiān)聽
var count = 0.obs;
/// 響應組件
Obx(() => Text("$count"))
/// 變量修改,同步 Obx 變化
count ++
6舱卡、為什么obs能監(jiān)聽到改變

原因就是obs 這個擴展方法會返回一個 RxInt 類型的對象辅肾,這種對象核心在于他的 get 和 set 方法。內(nèi)部添加了監(jiān)聽addListener轮锥,所以能隨時監(jiān)聽到數(shù)據(jù)的改變矫钓。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市舍杜,隨后出現(xiàn)的幾起案子新娜,更是在濱河造成了極大的恐慌,老刑警劉巖既绩,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件概龄,死亡現(xiàn)場離奇詭異,居然都是意外死亡饲握,警方通過查閱死者的電腦和手機私杜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來救欧,“玉大人衰粹,你說我怎么就攤上這事“实。” “怎么了寄猩?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長骑疆。 經(jīng)常有香客問我,道長替废,這世上最難降的妖魔是什么箍铭? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮椎镣,結果婚禮上诈火,老公的妹妹穿的比我還像新娘。我一直安慰自己状答,他們只是感情好冷守,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惊科,像睡著了一般拍摇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上馆截,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天充活,我揣著相機與錄音蜂莉,去河邊找鬼。 笑死混卵,一個胖子當著我的面吹牛映穗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播幕随,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼蚁滋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赘淮?” 一聲冷哼從身側響起辕录,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拥知,沒想到半個月后踏拜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡低剔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年速梗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片襟齿。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡姻锁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出猜欺,到底是詐尸還是另有隱情位隶,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布开皿,位于F島的核電站涧黄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏赋荆。R本人自食惡果不足惜笋妥,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窄潭。 院中可真熱鬧春宣,春花似錦、人聲如沸嫉你。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽幽污。三九已至嚷辅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間油挥,已是汗流浹背潦蝇。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工款熬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人攘乒。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓贤牛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親则酝。 傳聞我的和親對象是個殘疾皇子殉簸,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

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