Widget 是 Flutter 世界里對視圖的一種結(jié)構(gòu)化描述益缠,你可以把它看作是前端中的“控件”或“組件”例驹。Widget 是控件實現(xiàn)的基本邏輯單位拾积,里面存儲的是有關(guān)視圖渲染的配置信息储矩,包括布局笨农、渲染屬性坡椒、事件響應(yīng)信息等扰路。
Element 是 Widget 的一個實例化對象,它承載了視圖構(gòu)建的上下文數(shù)據(jù)倔叼,是連接結(jié)構(gòu)化的配置信息到完成最終渲染的橋梁汗唱。
Flutter 渲染過程,可以分為這么三步:
- 首先丈攒,通過 Widget 樹生成對應(yīng)的 Element 樹哩罪;
- 然后,創(chuàng)建相應(yīng)的 RenderObject 并關(guān)聯(lián)到 Element.renderObject 屬性上巡验;
- 最后际插,構(gòu)建成 RenderObject 樹,以完成最終的渲染显设。
Element 同時持有 Widget 和 RenderObject框弛。而無論是 Widget 還是 Element,其實都不負責(zé)最后的渲染捕捂,只負責(zé)發(fā)號施令瑟枫,真正去干活兒的只有 RenderObject
因為 Widget 具有不可變性,但 Element 卻是可變的绞蹦。實際上力奋,Element 樹這一層將 Widget 樹的變化(類似 React 虛擬 DOM diff)做了抽象榜旦,可以只將真正需要修改的部分同步到真實的 RenderObject 樹中幽七,最大程度降低對真實渲染視圖的修改,提高渲染效率溅呢,而不是銷毀整個渲染視圖樹重建澡屡。這,就是 Element 樹存在的意義咐旧。