Flutter 是一個使用 Dart 語言構建的 UI 工具包,因此它完全遵循 Dart 的語法和規則。Dart 中的?const
?是語言層面的特性,而 Flutter 因其聲明式 UI?和頻繁重建的特性,將?const
?的效能發揮到了極致。
Dart 中的?const
(語言層面)
在 Dart 語言中,const
?用于創建編譯時常量。它的核心特性如下:
1. 編譯時確定
編譯時確定:const
?變量的值必須在代碼編譯時就能完全確定。它不能是運行時才能計算出來的值。
// 正確示例
const int a = 1;
const double b = 1.0 + 2.0; // 編譯器能計算這個結果
const List<int> c = [1, 2, 3];// 錯誤示例
var currentTime = DateTime.now();
const d = currentTime; // 錯誤!DateTime.now()是運行時值
const e = someFunction(); // 錯誤!函數返回值是運行時值
2.?規范化和唯一性
規范化和唯一性:在程序整個生命周期中,相同的?const
?表達式只會被計算一次,并在內存中創建唯一的一個實例。
const list1 = [1, 2];
const list2 = [1, 2];
const list3 = [1, 2];print(identical(list1, list2)); // 輸出:true
// identical 檢查兩個引用是否指向同一個對象
// list1, list2, list3 都是同一個實例
3.?深度不可變
深度不可變:const
?構造的對象及其所有字段都必須是不可變的(final
)。一旦創建,就無法更改。
const list = [1, 2, 3];
list.add(4); // 運行時報錯:Cannot add to an unmodifiable list
4.?遞歸的?const
遞歸的?const
:要創建一個?const
?的集合(如 List、Map、Set),其所有元素也必須是編譯時常量。
const list = [1, 2, [3, 4]]; // 內部嵌套的列表 [3,4] 也必須是 const
Flutter 中的?const
(應用層面)
Flutter 完全使用 Dart 語言,因此上面的所有規則都適用。Flutter 中?const
?的特殊之處在于它的應用場景和帶來的巨大性能 benefits。
為什么?const
?在 Flutter 中如此重要?
因為 Flutter 的 UI 是通過嵌套的?Widget?樹來構建的,而?build
?方法會因狀態變化、動畫等而被非常頻繁地調用(每秒60/120次)。每次調用?build
?都會創建一棵新的 Widget 樹。
沒有?
const
?的情況:Widget build(BuildContext context) {return Container(child: Text('Hello'), // 每次build都創建一個新的Text實例); // 每次build都創建一個新的Container實例 }
內存壓力:創建大量短暫的 Widget 實例。
GC 壓力:垃圾回收器需要頻繁工作,可能引起界面卡頓。
Diff 效率低:Flutter Framework 需要比較新舊 Widget 樹。即使UI沒變,新創建的實例也會讓框架做更多比對工作。
使用?
const
?的情況:Widget build(BuildContext context) {return const Container(child: Text('Hello'), // 永遠是內存中同一個實例); // 永遠是內存中同一個實例 }
零內存開銷:Widget 實例在編譯時即被創建,
build
?方法只是復用它們。無 GC 壓力:不產生垃圾對象。
極速 Diff:Flutter Framework 看到?
identical(oldWidget, newWidget) == true
,會直接跳過這個節點及其整個子樹的比對,大幅提升效率。
對比總結:Dart?const
?vs. Flutter?const
特性 | Dart 中的?const ?(通用概念) | Flutter 中的?const ?(具體應用) |
---|---|---|
本質 | 語言關鍵字,用于創建編譯時常量 | 就是 Dart 的?const ,主要用于構建 Widget 和相關類 |
目的 | 保證不可變性、實現數據共享 | 性能優化:減少重建開銷,提升應用流暢度 |
主要應用對象 | 基礎類型(int, String)、集合、自定義類 | Widget、EdgeInsets、BorderRadius、Colors、TextStyle?等 |
核心 benefit | 保證程序正確性、節省內存 | 減少內存分配、減輕GC壓力、加快渲染管線中的Diff過程 |