Flutter最小刷新范圍探索ValueListenableBuilder使用詳解
引子
管理對象太多?
刷新管理太麻煩 ?
Flutter刷新范圍控制不好 ?
不妨看看本文 , 希望提供給你一些思路吧 !
說起 Flutter 刷新, 你的第一印象是什么 ? setState ? 是的, 只要使用過 Flutter 的人, 第一印象都必然是 setState , 但是由于 setState 濫用的問題, 性能問題就脫穎而出.
因此產(chǎn)出了諸如 Fish_redux 之流, 這些框架盡可能的使用 StatelessWidget 而由框架本身來引導(dǎo)刷新. 那么, 我們除了框架, 有沒有辦法來控制 Flutter 的刷新呢?
ValueListenableBuilder
ValueListenableBuilder 是基于 Flutter 自身特點(diǎn)構(gòu)建的一個 widget. 它借助了觀察者模式 , 高效率的引導(dǎo) Flutter 框架來刷新指定位置. 在繁雜的界面中, 細(xì)粒化的更新特定的 widget. 我們接下來, 舉例子并分析一下它是如何用,怎么做的吧!
如何用
這里我們通過一個簡單的例子 - 計數(shù)器, 它的作用是每點(diǎn)擊一次按鈕, 數(shù)字便會增加一.
Scaffold( body: Center( child: Column( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ Text(num.toString()), IconButton( color: Colors.blue, onPressed: () { if (mounted) { setState(() { num++; }); } }, icon: const Icon(Icons.add), ), ], ), ), )
我們打開Android studio 自帶的工具 Flutter Performance , 打開 Track widget rebuilds. 記錄下點(diǎn)擊十次后, 整體界面的刷新次數(shù).
結(jié)果上, 我們發(fā)現(xiàn)了整體頁面的每個組件都刷新了十次. 我們再通過 ValueListenableBuilder 來重構(gòu)頁面, 并同樣刷新十次
final ValueNotifier<int> notifier = ValueNotifier(0); Scaffold{ body: Column{ ... children: [ ValueListenableBuilder<int>( valueListenable: notifier, builder: (BuildContext context, value, Widget? child) { return Text( value.toString(), style: const TextStyle(fontSize: 20), ); }, ), ... ] } }
這次我們可以看到,除了 ValueListenableBuilder 和 Text 本身刷新了十次, 其余的 widget沒有再刷新. 因此, 我們可以推斷出層級越深、組件越多, 我們優(yōu)化的效果也就越明顯
那么, 這是怎么做到的呢 ? 讓我們來一起探究一下 .
怎么做
ValueListenableBuilder 是一個 StatefulWidget. 也就是說它具備刷新的能力, 它通過監(jiān)聽 ValueListenable 對象的變換.我們將目光轉(zhuǎn)到它的 State 中. 在 initState 中 , 也就是最初加載這個 widget 的時候. 我們初始化了 value 的值, 并且增加了一個監(jiān)聽.
@override void initState() { super.initState(); value = widget.valueListenable.value; widget.valueListenable.addListener(_valueChanged); }
在這個監(jiān)聽中, 我們發(fā)現(xiàn)只要 valueListenable 的值發(fā)生變化, 便會立即通知當(dāng)前 state 刷新. 因此它的刷新范圍只限制于局部.
void _valueChanged() { setState(() { value = widget.valueListenable.value; }); }
同時, 它在外部可能刷新修改 valueListenable 對象的時候, 移除了之前的監(jiān)聽. 并增加了新的監(jiān)聽對象. 其余的步驟還是和之前一樣.
@override void didUpdateWidget(ValueListenableBuilder<T> oldWidget) { super.didUpdateWidget(oldWidget); if (oldWidget.valueListenable != widget.valueListenable) { oldWidget.valueListenable.removeListener(_valueChanged); value = widget.valueListenable.value; widget.valueListenable.addListener(_valueChanged); } }
通過這一系列的操作, Flutter 實現(xiàn)了點(diǎn)對點(diǎn)的刷新方案.
不足點(diǎn)
雖然 ValueListenableBuilder 已經(jīng)解決了大部分刷新場景需要定向刷新的需求, 但是它刷新的顆粒度還不夠. 如果我們針對每個 widget 都需要不同的對象通知更新, 那么, 我們就要自己手動創(chuàng)建 N 個通知者, 這給開發(fā)帶來了難以預(yù)料的維護(hù)難度. 因此, 在實際運(yùn)用的場景中, 我們更偏向于單個不與其他業(yè)務(wù)接觸的業(yè)務(wù)或者一個自行維護(hù)的widget. 盡可能減少業(yè)務(wù)復(fù)雜度. 為了解決這種問題, Getx、Bloc、Provider都算比較好的狀態(tài)管理框架.
以上就是Flutter最小刷新范圍探索ValueListenableBuilder使用詳解的詳細(xì)內(nèi)容,更多關(guān)于Flutter ValueListenableBuilder的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Kotlin使用TransitionDrawable實現(xiàn)顏色漸變效果流程講解
這篇文章主要介紹了Kotlin使用TransitionDrawable實現(xiàn)顏色漸變效果,這里,我們通過TransitionDrawable顯示顏色漸變效果,包括背景顏色的變化,以及圖片與圖片的漸變效果2023-02-02Android自定義View實現(xiàn)箭頭沿圓轉(zhuǎn)動實例代碼
這篇文章主要介紹了Android自定義View實現(xiàn)箭頭沿圓轉(zhuǎn)動實例代碼,需要的朋友可以參考下2017-09-09Android NDK開發(fā)簡單程序分享(Hello Word!)
本文主要對Android NDK開發(fā)簡單程序(Hello Word!)的實現(xiàn)步驟及方法進(jìn)行詳細(xì)介紹。具有很好的參考價值,需要的朋友一起來看下吧2016-12-12Android 個人理財工具二:使用SQLite實現(xiàn)啟動時初始化數(shù)據(jù)
本文主要介紹 Android 使用SQLite實現(xiàn)啟動時初始化數(shù)據(jù),這里對SQLite 的數(shù)據(jù)庫進(jìn)行詳解,附有示例代碼,有興趣的小伙伴可以參考下2016-08-08Android判斷現(xiàn)在所處界面是否為home主桌面的方法
這篇文章主要介紹了Android判斷現(xiàn)在所處界面是否為home主桌面的方法,涉及Android界面判斷的相關(guān)技巧,需要的朋友可以參考下2015-05-05Android開發(fā)之Animations動畫用法實例詳解
這篇文章主要介紹了Android開發(fā)之Animations動畫用法,結(jié)合實例形式詳細(xì)分析了Animations動畫的類型、組成、模式及對應(yīng)的使用技巧,需要的朋友可以參考下2016-02-02Android PopupWindow實現(xiàn)左側(cè)彈窗效果
這篇文章主要為大家詳細(xì)介紹了Android PopupWindow實現(xiàn)左側(cè)彈窗效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10