【Flutter】Widget、Element和Render的關系-Flutter三棵樹

【Flutter】Widget、Element和Render的關系-Flutter三棵樹

一、前言

在 Flutter 中,所謂的“三棵樹”是指:

  • Widget Tree(部件樹)
  • Element Tree(元素樹)
  • Render Tree(渲染樹)

它們是 Flutter 框架內部 UI 構建與渲染機制中的核心概念,三者相互協作,共同支撐起高性能的界面渲染。

By the way,博主在面試的時候被問了「三棵樹是什么?」,我一時不知道說的是啥,但是我知道他們的聯系,之前一直從事原生開發,第一次面試Flutter( ̄. ̄)( ̄? ̄)ㄟ(▔,▔)ㄏ。


二、三棵樹是什么

1、Widget Tree(部件樹)

  • 是什么?
    Widget 是 Flutter 中的 UI 聲明式組件,比如 TextContainerRowColumn 等。

  • 特點:

    • 不可變的(immutable)
    • 描述 UI 的靜態結構
    • 每次 build() 都會重新創建新的 Widget 樹
  • 作用:
    用于描述你想“畫”什么,但本身不具備渲染能力。


2、Element Tree(元素樹)

  • 是什么?
    每個 Widget 被插入樹中后,都會生成對應的 Element(元素),用于維護 widget 的上下文(state、位置等)。

  • 特點:

    • 是 widget 的“實例化”版本
    • 可變對象,框架會盡量重用元素以優化性能
    • 包含對 widget 的引用以及對渲染對象(RenderObject)的引用(若有)
  • 作用:

    • 連接 widget(聲明)和 render object(繪制)之間的橋梁

3、Render Tree(渲染樹)

  • 是什么?
    真正承擔繪制任務的對象樹,所有具有可視化能力的 Widget(如 ContainerText)最終會轉化為 RenderObject 并構建成渲染樹。

  • 特點:

    • 控制尺寸、布局、繪制、命中測試等底層功能
    • 位于 Flutter 的渲染層(flutter/rendering
    • 通常由 RenderBox 及其子類構成
  • 作用:

    • 負責計算布局、繪制 UI 到屏幕

4、三棵樹的聯系

  1. 你編寫的 Flutter 界面,首先構建出一棵 Widget 樹
  2. Flutter 框架根據 Widget 樹構造或更新對應的 Element 樹
  3. 如果 Widget 是有可視化效果的,它還會創建相應的 RenderObject,并組成 Render Tree
  4. Render Tree 最終執行布局和繪制,渲染出用戶看到的界面

5、舉例說明

Widget build(BuildContext context) {return Column(children: [Text("Hello"),Container(padding: EdgeInsets.all(8),child: Text("World"),),],);
}
  • Widget Tree:構建出 Text、Container、Text 等節點
  • Element Tree:每個 Widget 會創建一個對應的 Element(StatelessElement / StatefulElement)
  • Render Tree:Text → RenderParagraph,Container → RenderDecoratedBox,控制真實布局和繪制

三、總結對比

樹類型是否可變作用生命周期
Widget Tree不可變描述 UI 結構每次 build 重建
Element Tree可變管理 widget 實例上下文盡量復用
Render Tree可變控制布局與繪制可復用/更新

在這里插入圖片描述

四、關于作者(ZFJ_張福杰)

  • 官網:https://zfjsafe.com
  • 博客:https://zfj1128.blog.csdn.net
  • Github:https://github.com/zfjsyqk
  • Gitee:https://gitee.com/zfj1128
  • 打賞:https://zfjsafe.com/paycode

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

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

相關文章

IO之詳解cin(c++IO關鍵理解)

目錄 cin原理介紹 控制符(hex、oct、dec) cin如何檢查輸入 cin與字符串 cin.get(char ch) cin.get(void) istream &get(char*,int) istream &get(char*,int,char) istream &getline(char*,int); 遇到文件結尾EOF 無法完成一次完整輸入:設置f…

Bootstrap 5學習教程,從入門到精通, Bootstrap 5 分頁(Pagination)知識點及案例代碼(13)

Bootstrap 5 分頁(Pagination)知識點及案例代碼 Bootstrap 5 提供了強大的分頁組件,幫助開發者輕松實現分頁功能。以下是關于 Bootstrap 5 分頁的詳細語法知識點以及一個完整的案例代碼,包含詳細注釋,幫助初學者快速上…

Dina靶機滲透

1.信息查詢 1.1. Ip查詢 arp-scan -l 192.168.220.137 1.2. 端口收集 nmap -T4 -A -p- 192.168.220.137 1.3. 目錄掃描 dirsearch -u 192.168.220.137 -e* -i 200 通過訪問 robots.txt 文件發現有些禁止訪問得目錄 User-agent: *Disallow: /ange1Disallow: /angel1Dis…

通俗理解存儲過程注入

【通俗理解】存儲過程注入:SQL注入的“豪華升級版” 一、從廚房做菜說起:為什么需要存儲過程? 想象你經營一家連鎖餐廳,每道菜的制作流程非常復雜(比如“招牌紅燒肉”需要先焯水、再炒糖色、最后慢燉1小時&#xff09…

【算法】基于中位數和MAD魯棒平均值計算算法

問題 在項目中,需要對異常值進行剔除,需要一種魯棒性比較好的方法,總結了一個實踐方法。 方法 基于中位數和MAD(中位數絕對偏差)的魯棒平均值計算算法的詳細過程,按照您要求的步驟分解: 算法…

插入點(position) 和對齊點(AlignmentPoint)詳解——CAD c#二次開發

在 AutoCAD 中,文本對象的位置由插入點(position) 和對齊點(Alignment Point) 共同控制,兩者的關系取決于文本的對齊方式。以下是詳細說明: 一、插入點與對齊點的定義 1. 插入點(p…

QT打包應用

本次工程使用qt mingGw 64-bit 下面詳細介紹下windows平臺qt應用程序打包流程 1、先編譯項目的release版本生成exe文件 2、創建腳本運行windeployqt.exe完成打包 rundeploy.bat腳本 set PATHE:\Tools\qt\Qt5\5.14.2\mingw73_64\bin;%PATH% windeployqt.exe MyDesignWidget.ex…

[軟件測試]:什么是自動化測試?selenium+webdriver-manager的安裝,實現你的第一個腳本

目錄 1. 什么是自動化測試? 回歸測試 自動化分類 2. web自動化測試 3. selenium 1. 什么是自動化測試? 通過自動化測試工具,編寫腳本,自動執行測試用例,主要用于回歸測試,性能測試等重復測試任務 常…

使用OpenCV和Python進行圖像掩膜與直方圖分析

文章目錄 引言1. 準備工作2. 加載并顯示原始圖像3. 創建掩膜3. 應用掩膜5. 計算并顯示直方圖6. 結果分析7. 總結 引言 在圖像處理中,掩膜(Mask)是一個非常重要的概念,它允許我們選擇性地處理圖像的特定區域。今天,我將通過一個實際的例子來展…

Genio 1200 Evaluation MT8395平臺安裝ubuntu

官網教程: Getting Started with Genio 1200 Evaluation Kit — Ubuntu on Genio documentation Windows PC工具: Setup Tool Environment (Windows) — IoT Yocto documentation 鏡像下載地址: Install Ubuntu on MediaTek Genio | Ubu…

如何畫好架構圖:架構思維的三大底層邏輯

👉目錄 0 前言 1 宏觀 2 中觀 3 微觀 4 補充 俗話說,一圖勝千言。日常工作中,當我們要表達自己的設計思路的時候,會畫各式各樣的圖。但因為各自知識儲備的差異,思維的差異,不同類型的系統側重的架構設計點也…

Spring MVC擴展消息轉換器-->格式化時間信息

Spring MVC 的消息轉換器的作用:在 HTTP 請求/響應與 Java 對象之間進行轉換 可以自行擴展消息轉換器 一、創建對象映射規則 package com.sky.json;import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.Objec…

Elasticsearch 的自動補全以及RestAPI的使用

Elasticsearch 提供了強大的自動補全 (Autocomplete) 功能,以下為一個基礎的自動補全DSL語句 {"suggest": {"my_suggestion": { // 自定義建議器名稱,可按需修改"text": "ap", // 用戶輸入的前綴(如搜索框…

1.4、SDH網狀拓撲

鏈形網星形網樹形網環形網網孔形網 1.鏈形拓撲 結構: 節點像鏈條一樣首尾依次串聯連接。信號從一個節點傳到下一個節點,直至終點。 特點: 簡單經濟: 結構最簡單,成本最低,適用于沿線覆蓋(如鐵…

如何在 ArcGIS 中使用 Microsoft Excel 文件_20250614

如何在 ArcGIS 中使用 Microsoft Excel 文件 軟件版本:win11; ArcGIS10.8; Office2024 1. 確認 ArcGIS 10.8 對 .xlsx 文件的支持 ArcGIS 10.8 支持 .xlsx 文件(Excel 2007 及以上格式),但需要安裝 Microsoft Access Database …

Python----OpenCV(圖像處理——圖像的多種屬性、RGB與BGR色彩空間、HSB、HSV與HSL、ROI區域)

Python----計算機視覺處理(opencv:像素,RGB顏色,圖像的存儲,opencv安裝,代碼展示) Python----計算機視覺處理(Opencv:圖片顏色識別:RGB顏色空間,…

java設計模式[1]之設計模式概覽

文章目錄 設計模式什么是設計模式為什么要學習設計模式設計模式的設計原則設計模式的分類 設計模式 什么是設計模式 設計模式是前人根據經驗的總結,是軟件開發中的最佳實踐,幫助開發者在面對復雜設計問題時提供有效的解決方案。設計模式不僅僅只是一種…

aflplusplus:開源的模糊測試工具!全參數詳細教程!Kali Linux教程!(四)

使用 afl-lto clang LLVM 編譯器 1. -help 顯示可用選項 afl-lto --help 其他選項同上,這里不再展開敘述。 afl-lto 1. -help 顯示可用選項 afl-lto --help 其他選項同上,這里不再展開敘述。 afl-network-client 1. 幫助文檔 afl-network-cl…

區間合并:牛奶

區間合并:牛奶 牛奶 www.acwing.com/problem/content/description/1345/ 本質就是區間合并問題從第一次擠奶才開始計算兩個最長時間 import java.util.*;public class Main {static final int N 5010;static Pair[] pairs new Pair[N];static class Pair imple…

Hive實現值列表橫向展示(非列轉行)

一、場景說明: 當前有各個流程的節點名稱和節點時間。數倉中的表存在的格式為縱向存儲,分別為節點名稱、接收時間 現數據分析過程中需要將每個流程的節點時間橫向展示,如果沒有該節點則置空 這種區別于行轉列和列轉行的操作。(具體可參考博主**