最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Flutter最小刷新范圍探索ValueListenableBuilder使用詳解

 更新時間:2022年12月12日 14:25:11   作者:WeninerIo  
這篇文章主要為大家介紹了Flutter最小刷新范圍探索ValueListenableBuilder使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引子

管理對象太多?

刷新管理太麻煩 ?

Flutter刷新范圍控制不好 ?

不妨看看本文 , 希望提供給你一些思路吧 !

說起 Flutter 刷新, 你的第一印象是什么 ? setState ? 是的, 只要使用過 Flutter 的人, 第一印象都必然是 setState , 但是由于 setState 濫用的問題, 性能問題就脫穎而出.

因此產(chǎn)出了諸如 Fish_redux 之流, 這些框架盡可能的使用 StatelessWidget 而由框架本身來引導刷新. 那么, 我們除了框架, 有沒有辦法來控制 Flutter 的刷新呢?

ValueListenableBuilder

ValueListenableBuilder 是基于 Flutter 自身特點構(gòu)建的一個 widget. 它借助了觀察者模式 , 高效率的引導 Flutter 框架來刷新指定位置. 在繁雜的界面中, 細粒化的更新特定的 widget. 我們接下來, 舉例子并分析一下它是如何用,怎么做的吧!

如何用

這里我們通過一個簡單的例子 - 計數(shù)器, 它的作用是每點擊一次按鈕, 數(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. 記錄下點擊十次后, 整體界面的刷新次數(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ā)生變化, 便會立即通知當前 state 刷新. 因此它的刷新范圍只限制于局部.

 void _valueChanged() {
    setState(() { value = widget.valueListenable.value; });
  }

同時, 它在外部可能刷新修改 valueListenable 對象的時候, 移除了之前的監(jiān)聽. 并增加了新的監(jiān)聽對象. 其余的步驟還是和之前一樣.

  @override
  void didUpdateWidget(ValueListenableBuilder&lt;T&gt; oldWidget) {
    super.didUpdateWidget(oldWidget);
    if (oldWidget.valueListenable != widget.valueListenable) {
      oldWidget.valueListenable.removeListener(_valueChanged);
      value = widget.valueListenable.value;
      widget.valueListenable.addListener(_valueChanged);
    }
  }

通過這一系列的操作, Flutter 實現(xiàn)了點對點的刷新方案.

不足點

雖然 ValueListenableBuilder 已經(jīng)解決了大部分刷新場景需要定向刷新的需求, 但是它刷新的顆粒度還不夠. 如果我們針對每個 widget 都需要不同的對象通知更新, 那么, 我們就要自己手動創(chuàng)建 N 個通知者, 這給開發(fā)帶來了難以預料的維護難度. 因此, 在實際運用的場景中, 我們更偏向于單個不與其他業(yè)務接觸的業(yè)務或者一個自行維護的widget. 盡可能減少業(yè)務復雜度. 為了解決這種問題, Getx、Bloc、Provider都算比較好的狀態(tài)管理框架.

以上就是Flutter最小刷新范圍探索ValueListenableBuilder使用詳解的詳細內(nèi)容,更多關(guān)于Flutter ValueListenableBuilder的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

安泽县| 兴国县| 海南省| 体育| 晋中市| 阿城市| 广德县| 英吉沙县| 五常市| 保德县| 思茅市| 穆棱市| 贵南县| 新宁县| 阳春市| 盖州市| 儋州市| 昌平区| 仁布县| 五常市| 牡丹江市| 叙永县| 萨迦县| 玛曲县| 钟山县| 镇坪县| 台中县| 贵港市| 陇南市| 陇川县| 宜阳县| 宜都市| 道孚县| 东海县| 马边| 柳江县| 乌什县| 周口市| 东山县| 万宁市| 聂拉木县|