// Android 設置某文本控件展現文案爲 Hello World TextView textView = (TextView) findViewById(R.id.txt); textView.setText("Hello"); // iOS 設置某文本控件展現文案爲 Hello World UILabel *label = (UILabel *)[self.view viewWithTag:100]; label.text = @"Hello";
對咱們來講,若是要實現一樣的需求,則要稍微麻煩點:編程
除了設計好 Widget 佈局方案之 外,還須要提早維護一套文案數據集,瀏覽器
併爲須要變化的 Widget 綁定數據集中的數據,使 Widget 根據這個數據集完成渲染。網絡
總結來講,命令式編程強調精確控制過程細節;而聲明式編程強調經過意圖輸出結果總體。框架
對應到 Flutter 中,意圖是綁定了組件狀態的 State,結果則是從新渲染後的組件。less
在 Widget 的生命週期內,應用到 State 中的任何更改都將強制 Widget 從新構建。函數
其中,對於組件完成建立後就無需變動的場景,狀態的綁定是可選項。佈局
這裏「可選」就區分出了 Widget 的兩種類型,ui
即:StatelessWidget 不帶綁定狀態,而 StatefulWidget 帶綁 定狀態。操作系統
當你所要構建的用戶界面不隨任何狀態信息的變化而變化時,須要選擇使用 StatelessWidget,反之則選用 StatefulWidget。設計
前者通常用於靜態內容的展現,然後 者則用於存在交互反饋的內容呈現中。
接下來,我分別和你介紹 StatelessWidget 和 StatefulWidget,總結一些關於 Widget 選型的基本原則。
StatelessWidget
在 Flutter 中,Widget 採用由父到子、自頂向下的方式進行構建,父 Widget 控制着子 Widget 的顯示樣式,其樣式配置由父 Widget 在構建時提供。
用這種方式構建出的 Widget,有些(好比 Text、Container、Row、Column 等)在建立 時,除了這些配置參數以外不依賴於任何其餘信息,
換句話說,它們一旦建立成功就再也不關 心、也不響應任何數據變化進行重繪。
在 Flutter 中,這樣的 Widget 被稱爲 StatelessWidget(無狀態組件)。
這裏有一張 StatelessWidget 的示意圖,以下所示:
能夠看到,在構造後,build 方法隨即將子組件 RichText 經過其屬性列表(如文本 data、對齊方式 textAlign、文本展現方向 textDirection 等)初始化後返 回,以後 Text 內部再也不響應外部數據的變化。
那麼,什麼場景下應該使用 StatelessWidget 呢?
一個簡單的判斷規則:父 Widget 是否能經過初始化參數徹底控制其 UI 展現效果?
若是能,那麼咱們就可使用 StatelessWidget 來設計構造函數接口了。
StatefulWidget
與 StatelessWidget 相對應的,有一些 Widget(好比 Image、Checkbox)的展現,除了父 Widget 初始化時傳入的靜態配置以外,
還須要處理用戶的交互(好比,用戶點擊按 鈕)或其內部數據的變化(好比,網絡數據回包),並體如今 UI 上。
StatefulWidget 示意圖
以前瞭解到,Widget 是不可變的,發生變化時須要銷燬重建,因此談不上狀態。
其實,StatefulWidget 是以 State 類代理 Widget 構建的設計方式實現的。