Flutter狀態管理篇之ValueNotifier(三)

目錄

前言

一、ValueNotifier 概述

二、ValueNotifier 的實現原理

1.類定義

1.類定義

2.關鍵字段

3.關鍵方法

1.構造函數

2.getter:value

3.setter:value:

4.toString

2.繼承自ChangeNotifier的機制

3.ValueListenable 接口

三、ValueNotifier 的用法

1.基本用法

2.手動監聽

3.結合 Provider

四、ValueNotifier 與 ChangeNotifier 的比較

1.繼承關系

2.功能差異

3.實現差異

4.使用場景差異

5.性能與復雜性

五、ValueNotifier 的優勢與局限

1.優勢

2.局限

六、實際應用建議

七、總結


前言

        在上一篇文章中,介紹了ChangeNotifier的用法以及實現原理。

        本文將詳細介紹 ValueNotifier 的實現原理、用法,以及它與 ChangeNotifier 的關系和區別,幫助開發者更好地理解和應用它們。

一、ValueNotifier 概述

        ValueNotifier 是 Flutter 基礎庫(package:flutter/foundation.dart)中的一個類,繼承自 ChangeNotifier,用于管理單一值的狀態變化。它通過監聽值的變化并通知注冊的監聽者,觸發 UI 重建。ValueNotifier 是輕量級的狀態管理工具,特別適合簡單場景,例如計數器、開關狀態或表單輸入。

        ValueNotifier的核心特征如下:

  1. 單一值管理:ValueNotifier 持有一個類型為 T 的值,值的變化會觸發通知。

  2. 繼承自 ChangeNotifier:復用了 ChangeNotifier 的監聽者管理和通知機制。

  3. 簡單易用:通過 ValueListenableBuilder 或手動監聽,輕松集成到 Flutter 應用中。

二、ValueNotifier 的實現原理

        ValueNotifier 的實現非常簡潔,它直接繼承了 ChangeNotifier,并在其基礎上添加了值管理和通知邏輯。以下是 ValueNotifier 的核心源碼解析:

1.類定義

1.類定義

class ValueNotifier<T> extends ChangeNotifier implements ValueListenable<T> {ValueNotifier(this._value);T _value;@overrideT get value => _value;set value(T newValue) {if (_value == newValue) {return;}_value = newValue;notifyListeners();}@overrideString toString() => '${describeIdentity(this)}($value)';
}

2.關鍵字段

    _value:存儲類型為 T 的值,表示當前狀態。

        類型安全性:通過泛型 T,確保值的類型安全。

3.關鍵方法

1.構造函數

ValueNotifier(this._value);

        初始化時傳入一個初始值 _value,存儲為內部狀態。

2.getter:value

T get value => _value;

        初始化時傳入一個初始值 _value,存儲為內部狀態。

3.setter:value:

set value(T newValue) {
  if (_value == newValue) {
    return;
  }
  _value = newValue;
  notifyListeners();
}

        當設置新值時,先檢查新值是否與舊值相等(使用 == 比較)。

        如果值未變,直接返回(避免不必要的通知)。

        如果值變化,更新 _value 并調用 notifyListeners 通知所有監聽者。

        注意:notifyListeners 是從 ChangeNotifier 繼承的方法,用于觸發監聽者回調。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915300.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915300.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915300.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ubuntu togo 系統安裝指南

制作一個 “Ubuntu To Go” 系統&#xff08;也就是一個可以隨身攜帶、在不同電腦上啟動并擁有持久化存儲的U盤系統&#xff09;是解決你問題的完美方案。 這樣一來&#xff0c;你就可以&#xff1a; 不改動你現有的電腦系統 (保留你的Ubuntu 20.04 或 Windows)。擁有一個完整…

Python爬蟲實戰:研究pefile庫相關技術

一、引言 可執行文件(Portable Executable,PE)是 Windows 操作系統中最常見的文件格式,包括.exe、.dll、.sys 等多種類型。對 PE 文件的分析在軟件逆向工程、惡意軟件檢測、系統安全研究等領域具有重要意義。傳統的 PE 文件分析主要依賴手動操作和專業工具,效率較低且對分…

盟接之橋說制造:差異化定位與效率競爭的雙輪驅動

在當今競爭日益激烈的商業環境中&#xff0c;企業如何在市場中脫穎而出&#xff0c;既避免陷入同質化的價格戰&#xff0c;又能夠通過效率提升實現可持續發展&#xff0c;是每一個經營者必須思考的問題。本文將圍繞“差異化”與“效率競爭”兩大核心戰略展開分析&#xff0c;探…

Vue基礎(前端教程①-路由)

項目結構src/├── router/│ └── index.js # 路由配置├── components/│ ├── Home.vue # 首頁組件│ ├── About.vue # 關于頁組件│ └── Contact.vue # 聯系頁組件├── App.vue # 根組件&#xff08;含導航欄&…

駕馭 Spring Boot 事件機制:8 個內置事件 + 自定義擴展實戰

駕馭 Spring Boot 事件機制&#xff1a;8 個內置事件 自定義擴展實戰在 Spring Boot 應用的完整生命周期中&#xff0c;框架為我們預埋了 8 個關鍵事件&#xff08;Application-level & Context-level&#xff09;。 理解并善用這些事件&#xff0c;可以在“不侵入框架、…

【kafka4源碼學習系列】kafka4總體架構介紹

二 kafka架構介紹學習一個系統之前很重要的一點就是先了解這個系統整體的架構&#xff0c;這能夠使我們對整個系統有個總體的認識&#xff0c;清楚地知道這個系統有什么能力。這不僅幫助我們學習時快速定位到我們想要的內容&#xff0c;還能避免我們學習過程中在龐大的系統中迷…

java內存圖

java內存圖java文件運行流程程序的內存空間認識虛擬機棧程序的執行流程認識堆java的類與對象的關系java文件運行流程 有這樣的一份 java 文件 在該目錄下的終端運行 javac Hello.java 命令&#xff0c;會生成 Hello.class 文件&#xff0c;內容如下&#xff1a; Hello.java 打…

vscode編輯Markdown文件

一.安裝Markdown的插件 vscode的擴展&#xff0c;搜索Markdown Preview Enhanced的插件&#xff0c;并安裝。 其他的常用插件&#xff0c;還包括&#xff1a; Markdown All in One &#xff1a;提供了許多有用的功能&#xff0c;如快捷鍵支持、自動預覽、TOC&#xff08;目錄&…

【PTA數據結構 | C語言版】查找樹中帶有指定數據的結點

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 請編寫程序&#xff0c;創建有 4 個結點的樹&#xff0c;然后查找給定的 x。 輸入格式&#xff1a; 輸入首先在第一行給出 4 個正整數&#xff0c;依次對應樹的根結點、根的第 1、2、3 個孩子結點的…

PostgreSQL常用命令與工具指南

文章目錄PostgreSQL常用命令與工具指南簡介1. 連接與基本操作連接數據庫環境變量設置&#xff08;避免密碼輸入&#xff09;常用元命令2. 數據庫與表管理數據庫操作創建數據庫刪除數據庫修改數據庫屬性表操作創建表修改表結構刪除表索引管理創建索引刪除索引3. 數據操作(CRUD)插…

SpringBoot項目部署至云服務器

目錄 一、后端項目部署 1、修改配置文件 2、清理打包緩存&#xff0c;打jar包&#xff08;兩種方式二選一&#xff09; 自動打包 手動打包 打包成功狀態 3、將jar包導入宿主機上 jar包位置 jar包上傳 jar包運行 瀏覽器測試 二、前端代碼 docker搭建nginx的基本步驟 打…

Agent-S:重新定義下一代 AI 智能體開發框架

Agent-S&#xff1a;重新定義下一代 AI 智能體開發框架 —— 探索 simular-ai 的開源革命 引言 2025 年&#xff0c;AI 智能體&#xff08;Agent&#xff09;技術正從概念走向產業核心。從自動化工作流到復雜決策系統&#xff0c;開發者亟需更高效的工具鏈。在這一背景下&am…

保持視頻二維碼不變,如何更新視頻內容,節省物料印刷成本

保持視頻二維碼不變&#xff0c;如何更新視頻內容&#xff0c;節省物料印刷成本&#xff1f; 視頻替換功能&#xff0c;是指在保持視頻二維碼不變、視頻觀看地址不變、視頻調用代碼不變的情況下替換視頻內容&#xff0c;從而節省用戶印刷物料的成本&#xff0c;滿足用戶更新視…

flutter項目調試問題小結

背景 目標是用android studio flutter 跑hello world 下載 android studio 我下載的是2024.3.2.15版本 最新版下載首頁就能下&#xff1a;下載 Android Studio 和應用工具 - Android 開發者 | Android Developers 歷史版本可在歸檔列表下載&#xff1a;Android Studio…

明細列表,明細grid中的默認按鈕失效,配置按鈕失效

明細列表&#xff0c;明細grid中的默認按鈕失效&#xff0c;配置按鈕失效原因&#xff1a;采用通配的寫法導致的默認按鈕失效if(menuDetails){menuDetails.forEach((item) > {const { name, menu_detail_columns, menu_detail_buttons, save_url} item;this.set(${name}Gri…

Matplotlib 30分鐘精通

?? Matplotlib 30分鐘精通計劃(完整版含輸出) ? 時間分配 5分鐘:Matplotlib基礎概念和簡單圖表 10分鐘:常用圖表類型詳解 10分鐘:圖表美化和定制 5分鐘:綜合實戰練習 ?? 第一部分:Matplotlib基礎概念 (5分鐘) 1. 什么是Matplotlib? import matplotlib.pyplot a…

7月19日 暴雨藍色預警:全國多地迎強降雨,需防范次生災害

中央氣象臺7月19日10時繼續發布暴雨藍色預警,預計未來24小時(19日14時至20日14時),我國多地將迎來大到暴雨,局地甚至出現大暴雨,并伴有短時強降水、雷暴大風等強對流天氣,需加強防范。 強降雨覆蓋范圍廣,多地需警惕極端降水 此次降雨影響范圍廣泛,涉及華北、華南、西…

Redis學習-05Redis基本數據結構

Redis 數據結構 String 字符串 基本命令表命令執行效果時間復雜度set key value [key value…]設置 key 的值是 valueO(k), k 是鍵個數get key獲取 key 的值O(1)del key [key …]刪除指定的 keyO(k), k 是鍵個數mset key value [key value …]批量設置指定的 key 和 valueO(k),…

開啟modbus tcp模擬調試

1、新建modbus tcp服務器 ?功能差異??客戶端功能?&#xff1a; 生成并發送Modbus請求報文&#xff08;如功能碼03讀取寄存器&#xff09;。?? 解析服務器響應數據&#xff0c;實現遠程監控或控制。?? ?服務器端功能?&#xff1a; 監聽默認端口&#xff08;如502&…

昇思+香橙派 AI 開發實踐:DeepSeek 全流程指南(基于 openEuler)

一、 環境準備 1. 鏡像燒錄 鏡像燒錄可以在任何操作系統內執?&#xff0c;這?以在Windows系統為例&#xff0c;使用balenaEtcher?具&#xff0c;快速燒錄鏡像到Micro SD卡中。 本章節所需的軟/硬件如下&#xff1a; 軟件相關&#xff1a;balenaEtcher制卡?具、openEul…