關鍵字 const

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)、集合、自定義類WidgetEdgeInsetsBorderRadiusColorsTextStyle?等
核心 benefit保證程序正確性、節省內存減少內存分配、減輕GC壓力、加快渲染管線中的Diff過程

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

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

相關文章

Ubuntu22.04中使用cmake安裝abseil-cpp庫

Ubuntu22.04中使用cmake安裝abseil-cpp庫 關于Abseil庫 Abseil 由 Google 的基礎 C 和 Python 代碼庫組成&#xff0c;包括一些正支撐著如 gRPC、Protobuf 和 TensorFlow 等開源項目并一起 “成長” 的庫。目前已開源 C 部分&#xff0c;Python 部分將在后續開放。 Abseil …

FreeRTOS項目(序)目錄

這章是整個專欄的目錄&#xff0c;負責記錄這個小項目的開發日志和目錄。附帶總流程圖。 目錄 項目簡介 專欄目錄 開發日志 總流程圖 項目簡介 本項目基于STM32C8T6核心板和FreeRTOS&#xff0c;實現一些簡單的功能。以下為目前已實現的功能。 &#xff08;1&#xff09…

Python 多任務編程:進程、線程與協程全面解析

目錄 一、多任務基礎&#xff1a;并發與并行 1. 什么是多任務 2. 兩種表現形式 二、進程&#xff1a;操作系統資源分配的最小單位 1. 進程的概念 2. 多進程實現多任務 2.1 基礎示例&#xff1a;邊聽音樂邊敲代碼 2.2 帶參數的進程任務 2.3 進程編號與應用注意點 2.3.…

ADSL技術

<摘要> ADSL&#xff08;非對稱數字用戶線路&#xff09;是一種利用傳統電話線實現寬帶上網的技術。其核心原理是頻率分割&#xff1a;將一根電話線的頻帶劃分為語音、上行數據&#xff08;慢&#xff09;和下行數據&#xff08;快&#xff09;三個獨立頻道&#xff0c;從…

信號衰減中的分貝到底是怎么回事

問題&#xff1a;在一個低通濾波中&#xff0c;經常會看到一個值-3dB&#xff08;-3分貝&#xff09;&#xff0c;到底是個什么含義&#xff1f; 今天我就來粗淺的講解這個問題。 在低通濾波器中&#xff0c;我們說的 “截止頻率”&#xff08;或叫 - 3dB 點&#xff09;&…

工具分享--IP與域名提取工具2.0

基于原版的基礎上新增了一個功能點:IP-A段過濾&#xff0c;可以快速把內網192、170、10或者其它你想要過濾掉的IP-A段輕松去掉&#xff0c;提高你的干活效率&#xff01;&#xff01;&#xff01; 界面樣式預覽&#xff1a;<!DOCTYPE html> <html lang"zh-CN&quo…

如何通過日志先行原則保障數據持久化:Redis AOF 和 MySQL redo log 的對比

在分布式系統或數據庫管理系統中&#xff0c;日志先行原則&#xff08;Write-Ahead Logging&#xff0c;WAL&#xff09; 是確保數據一致性、持久性和恢復能力的重要機制。通過 WAL&#xff0c;系統能夠在發生故障時恢復數據&#xff0c;保證數據的可靠性。在這篇博客中&#x…

臨床研究三千問——臨床研究體系的3個維度(8)

在上周的文章中&#xff0c;我們共同探討了1345-10戰策的“臨床研究的起點——如何提出一個犀利的臨床與科學問題”。問題固然是靈魂&#xff0c;但若沒有堅實的骨架與血肉&#xff0c;靈魂便無所依歸。今天&#xff0c;我們將深入“1345-10戰策”中的“3”&#xff0c;即支撐起…

AI+預測3D新模型百十個定位預測+膽碼預測+去和尾2025年9月7日第172彈

從今天開始&#xff0c;咱們還是暫時基于舊的模型進行預測&#xff0c;好了&#xff0c;廢話不多說&#xff0c;按照老辦法&#xff0c;重點8-9碼定位&#xff0c;配合三膽下1或下2&#xff0c;殺1-2個和尾&#xff0c;再殺4-5個和值&#xff0c;可以做到100-300注左右。(1)定位…

萬字詳解網絡編程之socket

一&#xff0c;socket簡介1.什么是socketsocket通常也稱作"套接字"&#xff0c;?于描述IP地址和端?&#xff0c;是?個通信鏈的句柄&#xff0c;應用程序通常通過"套接字"向?絡發出請求或者應答?絡請求。?絡通信就是兩個進程間的通信&#xff0c;這兩…

維度躍遷:當萬物皆成電路,智能將從“擁有”變為“存在”

我們習以為常的電子世界&#xff0c;其本質是一個由電路構成的精密宇宙。而一場從二維到三維的終極變革&#xff0c;正在悄然醞釀&#xff0c;它將徹底顛覆我們創造和交互的方式。一、電子世界的本質&#xff1a;一切都是電路 在深入未來之前&#xff0c;我們首先要理解當下。電…

大語言模型預訓練數據采集與清洗技術實踐:從語料到知識庫的全流程優化

大語言模型(LLM)的性能上限由 “數據質量 數據規模 數據多樣性” 共同決定 —— 預訓練階段的海量語料決定模型的泛化能力與語言理解基礎,而知識庫數據則決定模型的知識準確性與領域專業性。當前 LLM 落地面臨的核心痛點之一,便是 “數據臟、處理難、知識雜”:預訓練語料…

模擬音頻采集設備的制作

模擬音頻程序與設備的制作 需要設備 esp32s3 pcm1808 pcm5102(非必須) 程序界面 程序代碼 代碼鏈接

Java Modbus通信實戰(四):Modbus通信測試與故障排查

在工業現場&#xff0c;設備通信系統就像工廠的神經網絡&#xff0c;連接著各種傳感器、控制器和執行器。當你搭建好這套系統后&#xff0c;最關鍵的一步就是全面測試&#xff0c;確保每個環節都能正常工作。 就像汽車出廠前要經過嚴格的路試一樣&#xff0c;Modbus RTU通信系統…

少兒編程C++快速教程之——1. 基礎語法和輸入輸出

1. 歡迎來到C編程世界&#xff01; 1.1 什么是編程&#xff1f; 編程就像是給計算機寫一份詳細的"說明書"&#xff0c;告訴它該做什么、怎么做。C是一種強大的編程語言&#xff0c;可以用來創建游戲、應用程序和各種有趣的軟件&#xff01; 1.2 第一個C程序&#xff…

arma::imat22

arma::imat22 是 Armadillo C 線性代數庫中定義的一個固定大小的 2x2 有符號整數矩陣類型。它主要用于處理小型、維度在編譯時已知的整數矩陣&#xff0c;因其在棧上分配內存&#xff0c;故通常比動態矩陣有更高的效率。 下面是一個匯總了 arma::imat22 主要特性的表格&#xf…

狗都能看懂的HunYuan3D 1.0詳解

HunYuan3D 1.0 HunYuan3D 1.0是2024年9月發布的一篇論文。雖然站在現在的時間節點&#xff0c;HunYuan3D系列已經出到2.5了&#xff0c;但是1.0版本的改進思路&#xff0c;和它trick集成的做法&#xff0c;還是很值得學習的。由于文章用到了很多技術&#xff0c;由于篇幅有限&a…

踏腳邁入奇幻樂園

每天早上上班的路上都會經過一個小花園。它被夾在丁字路口的拐角&#xff0c;面積不大&#xff0c;匆匆而過的行人都不會注意到它。但如果順著幾個不起眼的入口走進去&#xff0c;里面卻是別有洞天。清早的街道還沒有車水馬龍的喧嘩&#xff0c;花園里靜悄悄的。各式各樣的花草…

內存越界引發線程函數調用堆棧回溯異常以及INT 3軟中斷實戰分析案例分享

目錄 1、問題說明 2、導出dump文件時只是遇到了INT 3軟中斷&#xff0c;并沒有發生異常崩潰 3、函數中發生了棧內存越界&#xff0c;導致線程的棧回溯出異常&#xff0c;堆棧中只顯示一行函數調用記錄 3.1、處理Json數據時產生了異常 3.2、函數中發生棧內存越界&#xff0…

LeetCode 240: 搜索二維矩陣 II - 算法詳解(秒懂系列

文章目錄LeetCode 240: 搜索二維矩陣 II - 算法詳解題目描述Java解決方案算法思路核心理念為什么選擇右上角&#xff1f;可視化演示過程示例1&#xff1a;查找 target 5示例2&#xff1a;查找 target 20 (不存在)算法分析時間復雜度空間復雜度算法優勢關鍵要點擴展思考LeetCo…