跳到主內容

宣告式 UI 簡介

解釋了宣告式和指令式程式設計風格之間的區別。

本簡介描述了 Flutter 使用的宣告式風格與許多其他 UI 框架使用的命令式風格之間的概念性差異。

為什麼選擇宣告式 UI?

#

從 Win32 到 Web,再到 Android 和 iOS 的框架通常使用命令式 UI 程式設計風格。 這可能是你最熟悉的風格——你手動構建一個功能齊全的 UI 實體,例如 UIView 或等效物件,然後在 UI 更改時使用方法和 setter 對其進行修改。

為了減輕開發人員程式設計 UI 狀態轉換的負擔,Flutter 相反地讓開發人員描述當前的 UI 狀態,並將狀態轉換交給框架處理。

然而,這需要對如何操作 UI 進行略微的思維轉變。

如何在宣告式框架中更改 UI

#

考慮以下簡化示例

View B (contained by view A) morphs from containing two views, c1 and c2, to containing only view c3.

在命令式風格中,你通常會訪問 ViewB 的所有者並使用選擇器或 `findViewById` 或類似方法檢索例項 `b`,並在其上呼叫修改方法(並隱式使其失效)。 例如

java
// Imperative style
b.setColor(red)
b.clearChildren()
ViewC c3 = new ViewC(...)
b.add(c3)

你可能還需要在 ViewB 的建構函式中複製此配置,因為 UI 的真相來源可能比例項 `b` 本身更長壽。

在宣告式風格中,檢視配置(例如 Flutter 的 Widgets)是不可變的,並且只是輕量級的“藍圖”。 要更改 UI,一個 Widget 會在其自身上觸發重建(最常見的是在 Flutter 中呼叫 StatefulWidgets 上的 `setState()`),並構建一個新的 Widget 子樹。

dart
// Declarative style
return ViewB(color: red, child: const ViewC());

在這裡,Flutter 不會像 UI 更改時修改舊例項 `b`,而是構建新的 Widget 例項。 框架在後臺使用 RenderObjects 管理傳統 UI 物件(例如維護佈局狀態)的許多職責。 RenderObjects 在幀之間持久存在,Flutter 的輕量級 Widgets 會告訴框架在狀態之間修改 RenderObjects。 Flutter 框架處理其餘部分。