簡體   English   中英

Flutter 中有狀態和無狀態小部件之間的關系是什么?

[英]What is the relation between stateful and stateless widgets in Flutter?

有狀態小部件被定義為在其生命周期內改變其狀態的任何小部件。 但是對於StatelessWidget ,將StatefulWidget作為其子代之一是一種非常常見的做法。 如果StatelessWidget作為其子代之一,那么StatelessWidget不會變成有StatefulWidget嗎?

我嘗試查看文檔作為StatelessWidget代碼的一部分,但無法弄清楚StatelessWidget如何將Statefulwidget作為其子項並仍然保持StatelessWidget

Flutter 中有狀態和無狀態小部件的關系和區別是什么?

StatelessWidget永遠不會自行重建(但可以從外部事件重建)。 StatefulWidget可以。 這就是黃金法則。

但是任何類型的小部件都可以隨時重新繪制

無狀態僅意味着它的所有屬性都是不可變的,更改它們的唯一方法是創建該小部件的新實例。 例如,它不會鎖定小部件樹。

但是你不應該關心你的孩子是什么類型的。 它對你沒有任何影響。

有狀態窗口小部件定義為在其生存期內更改其狀態的任何窗口小部件。 但是,讓StatelessWidget擁有StatefulWidget作為其子級之一是一種非常普遍的做法。 如果將StatefulWidget作為其子級之一, StatelessWidget不會變成有StatefulWidget嗎?

我嘗試將文檔作為StatelessWidget代碼的一部分進行研究,但無法弄清楚StatelessWidget如何將Statefulwidget作為其子級,並且仍然保持StatelessWidget

Flutter中有狀態和無狀態小部件之間的關系和區別是什么?

來自flutter.io的文檔:

...這里要注意的重要一點是無狀態和有狀態小部件的核心行為相同。 他們重建每一幀,不同之處在於 StatefulWidget 有一個 State 對象,它跨幀存儲狀態數據並恢復它。

如果您有疑問,那么請始終記住這條規則:如果小部件發生變化(例如,用戶與其交互),則它是有狀態的。 但是,如果子級對更改做出反應,並且父級對更改沒有反應,則包含的父級仍然可以是無狀態小部件。

正如顫振文檔中所述

重點是什么?

有些小部件是有狀態的,有些是無狀態的。 如果一個小部件發生變化——例如,用戶與其交互——它就是有狀態的。 小部件的狀態由可以更改的值組成,例如滑塊的當前值或復選框是否被選中。 小部件的狀態存儲在 State 對象中,將小部件的狀態與其外觀分開。 當小部件的狀態改變時,狀態對象調用 setState(),告訴框架重繪小部件。

無狀態小部件沒有要管理的內部狀態。 Icon、IconButton 和 Text 是無狀態小部件的示例,它們是 StatelessWidget 的子類。

狀態小部件是動態的。 用戶可以與有狀態的小部件進行交互(例如,通過在表單中​​輸入內容或移動滑塊),或者它會隨時間發生變化(也許數據饋送會導致 UI 更新)。 Checkbox、Radio、Slider、InkWell、Form 和 TextField 是有狀態小部件的示例,它們是 StatefulWidget 的子類。

https://flutter.io/tutorials/interactive/#stateful-stateless

狀態是 (1) 可以在構建小部件時同步讀取和 (2) 可能在小部件的生命周期內更改的信息。 小部件實現者有責任使用 State.setState 確保在此類狀態更改時及時通知 State。

有狀態小部件

有狀態小部件是通過構建更具體地描述用戶界面的其他小部件的星座來描述用戶界面的一部分的小部件。 構建過程以遞歸方式繼續,直到用戶界面的描述完全具體(例如,完全由描述具體 RenderObject 的 RenderObjectWidgets 組成)。

當您描述的用戶界面部分可以動態更改時,例如由於具有內部時鍾驅動狀態或取決於某些系統狀態,有狀態小部件很有用。 對於僅依賴於對象本身的配置信息和小部件在其中膨脹的 BuildContext 的組合,請考慮使用 StatelessWidget。

StatefulWidget 實例本身是不可變的,並且將它們的可變狀態存儲在由 createState 方法創建的單獨 State 對象中,或者存儲在該 State 訂閱的對象中,例如 Stream 或 ChangeNotifier 對象,這些對象的引用存儲在 StatefulWidget 的最終字段中本身。

無狀態小部件

無狀態小部件是通過構建更具體地描述用戶界面的其他小部件的星座來描述用戶界面的一部分的小部件。 構建過程以遞歸方式繼續,直到用戶界面的描述完全具體(例如,完全由描述具體 RenderObject 的 RenderObjectWidgets 組成)。

當您描述的用戶界面部分不依賴於對象本身的配置信息和小部件在其中膨脹的 BuildContext 之外的任何其他內容時,無狀態小部件很有用。 對於可以動態更改的組合,例如由於具有內部時鍾驅動狀態或取決於某些系統狀態,請考慮使用 StatefulWidget。

無狀態小部件是靜態小部件。 您只需要在初始化無狀態小部件之前傳遞幾個屬性。 它們不依賴於任何數據更改或任何行為更改。 例如。 Text、Icon、RaisedButton 是無狀態小部件。

有狀態小部件是動態小部件,它們可以在運行時根據用戶操作或數據更改進行更新。 如果 Widget 可以在運行時更改其狀態,那么它就是有狀態的 Widget。

編輯 15/11/2018

如果輸入/外部數據發生變化(外部數據是通過構造函數傳遞的數據),無狀態小部件可以重新渲染。 因為Stateless Widgets沒有狀態,它們會被渲染一次,不會自己更新,只會在外部數據發生變化時更新。

有狀態的小部件有一個內部狀態,如果輸入數據發生變化或小部件的狀態發生變化,它可以重新渲染。

無狀態和有狀態小部件都有不同的生命周期。

我能想到一個非常簡單的比喻。 你有一些帶有書籍、裝飾品和電視的家具。 家具是無狀態的,它什么都不做也不動。 在電視的另一側,您可以打開、關閉、更改頻道、播放電影(如果連接了 DVD)等。電視具有影響其行為方式的內部狀態。 在家具中,您沒有狀態。 電視在家具中的存在並沒有給它增加一種狀態。 希望這可以幫助。

在編寫應用程序時,您通常會創作作為StatelessWidgetStatefulWidget子類的新小部件

以下是StatelessWidgetStatefulWidget之間的一些差異:

無狀態小部件:

  1. 具有不可變狀態的小部件。
  2. 無狀態小部件是靜態小部件。
  3. 它們不依賴於任何數據更改或任何行為更改。
  4. Stateless Widgets 沒有狀態,它們會被渲染一次並且不會自我更新,只會在外部數據發生變化時更新。
  5. 例如: TextIconRaisedButton是無狀態小部件。

有狀態小部件:

  1. 具有可變狀態的小部件。
  2. 有狀態小部件是動態小部件。
  3. 它們可以在運行時根據用戶操作或數據更改進行更新。
  4. 有狀態的小部件有一個內部狀態,如果輸入數據發生變化或者小部件的狀態發生變化,它可以重新渲染。
  5. 例如: CheckboxRadio ButtonSlider是有狀態的小部件

Stack Overflow 問題的答案 - statefulness vs stateless

在 Flutter 中,不同之處在於無狀態小部件可以由所有構造函數參數單獨定義。 如果您使用相同的參數創建兩個無狀態小部件,那么它們將是相同的。

但是,有狀態小部件不一定與使用相同構造函數參數構建的另一個小部件相同。 它可能處於不同的狀態。
實際上,有狀態小部件本身是不可變的(無狀態),但 Flutter 管理一個單獨的狀態對象並將其與小部件相關聯,如StatefulWidget doc 中所述 這意味着當 Flutter 重建一個有狀態的小部件時,它會檢查它是否應該重用以前的狀態對象,並在需要時將該狀態對象附加到小部件。

父小部件是無狀態的,因為它不關心子小部件的狀態。 有狀態的孩子本身(或技術上的 Flutter)會處理自己的狀態。
在高層次上,我同意這使父小部件有狀態,因為兩個父小部件可能包含兩個具有不同狀態的子小部件,因此它們本身在技術上是不同的。 但是從Flutter的角度來看,它構建父widget並不關心狀態,只有在構建子widget時才會考慮其狀態。

無狀態:小部件狀態僅創建一次,然后它可以更新值但不能顯式更新狀態 從那里的結構也可以清楚地看出這一點。 這就是為什么它只有一個類擴展了StatelessWidget 因此,如果我說,他們永遠無法再次運行build()方法。

有狀態:小部件可以在事件觸發時多次更新它們的狀態(本地)和值 這就是原因,實現方式也不同。 在這里,我們有 2 個類,一個是StatefulWidget ,另一個是 State 實現處理程序,即State<YourWidget> 因此,如果我說,他們可以根據觸發的事件一次又一次地重新運行build()方法。

下圖會有所幫助。

在此處輸入圖片說明

什么是有狀態和無狀態小部件?

TL;DR:允許您刷新屏幕的小部件是有狀態小部件。 沒有狀態的小部件是無狀態的。

更詳細地說,一個內容可以改變的動態小部件應該是一個有狀態的小部件。 無狀態小部件只能在更改參數時更改內容,因此需要在小部件層次結構中的位置點上方完成。 包含靜態內容的屏幕或小部件應該是無狀態小部件,但要更改內容,需要有狀態。

我在一個有趣的媒體故事中發現了這個相關內容。 別客氣!

免責聲明:- 從上周開始研究顫振:)

無狀態有狀態小部件有自己的生命周期來創建和更新 UI。 但是,您可以使用無狀態或有狀態來呈現 UI,但當 ui 完全或部分依賴於外部數據(例如 - 使用 api 呈現列表)而使用無狀態小部件呈現靜態 ui 時,實際上有狀態會更方便,就像任何輸入屏幕一樣一個很好的做法。

簡單來說:

正如我們所知,每個小部件都是顫振中的一個視圖。 其中有自己的類。 當我們使用這些類時,我們創建了它的一個對象。 我們為它們不同的變量/屬性賦值。 前任。 我們正在創建 Text 小部件,因此我們可以為其提供字符串、顏色、字體大小、字體系列。 因此,通過給出它,我們在創建它的同時定義了它的屬性。 到目前為止,無狀態或有狀態小部件是相同的,但是,

當我們想要一次又一次地更改/更新它的屬性(比如字符串或顏色)時,它應該是有狀態的小部件。

當我們在第一次定義它是無狀態小部件后不想更改其屬性時。

這意味着我們關心小部件持有/控制/顯示的數據。

所以無狀態是數據少,有狀態是數據滿。

現在,如果你定義了一個無狀態的類,這意味着這個類不關心/有變量,或者說它自己的類中的數據,即類級別,但它可能有另一個關心數據的小部件/類,即它是有狀態的. 所以對彼此沒有任何影響。

如果我在這里錯了,請糾正我。

什么是有狀態和無狀態小部件?

無狀態小部件:無狀態小部件僅在其父更改時構建。

有狀態的小部件:狀態完整的小部件保存小部件的狀態,並且可以在狀態改變時重建。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM