目錄
前言
一、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的核心特征如下:
-
單一值管理:
ValueNotifier
持有一個類型為T
的值,值的變化會觸發通知。 -
繼承自 ChangeNotifier:復用了
ChangeNotifier
的監聽者管理和通知機制。 -
簡單易用:通過
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 繼承的方法,用于觸發監聽者回調。