據我了解,與任何狀態相關的代碼的每一部分都會隨著狀態的變化而改變(重組)→
并且每個狀態都是可觀察的,并且依賴的 UI 部分會觀察該狀態并訂閱它(狀態),并且每當狀態更改時,都會通知它(重新繪制 UI 的那部分)并發生重組。
但是在這篇 google Thinking in compose的文章中,它說重組會隨著輸入的變化而發生,所以我很困惑。
重組是在輸入改變時再次呼叫您的可組合函式的程序。當函式的輸入發生變化時會發生這種情況。當 Compose 基于新輸入進行重構時,它只呼叫可能已更改的函式或 lambda,并跳過其余部分。通過跳過所有未更改引數的函式或 lambda,Compose 可以有效地重構。
此外,在compose-roadmap 的其他示例中,鼓勵提升狀態以使可組合函式無狀態以避免重新組合
因此,如果有人可以明確表示重組僅在狀態更改或輸入更改也會導致時發生,那就太好了?
預先感謝您的幫助
uj5u.com熱心網友回復:
當引數值更改或可組合函式中的可變狀態變數更新時,就會發生重組。
無狀態函式,有時稱為“不可變”函式,是指函式中不存盤資料的函式。這意味著如果您重復呼叫該函式,它將與您第一次呼叫它一樣。每次呼叫該函式時都不會保留任何變數的記憶體。
提升可組合的狀態意味著狀態變數被保留在可組合之外,并且這些狀態變數的值作為普通引數傳遞到可組合中。這允許您重用可組合項。如果您正在創建一個想要在一個專案中重用到另一個專案的可組合庫,這一點尤其重要。庫的用戶可以放心,沒有可組合項需要的狀態依賴項。如果你想要一個真正無狀態的可組合,你會避免做諸如傳遞視圖模型之類的事情。視圖模型非常依賴于它所在的應用程式,并且其中包含非常特定于應用程式的代碼。無狀態可組合組件不依賴于應用程式,因此可以在其他地方重用。
這并不意味著您不能在可組合物中使用視圖模型。最初,當 Compose 剛問世時,Google 反對這一點,但意識到這對開發人員來說非常尷尬。如果開發人員沒有理由在它出現的螢屏之外制作可重用的可組合,那么為每個可組合提升狀態會變得很痛苦,從而導致不必要的樣板代碼。所以一般規則是,如果您的可組合不會在其他地方重用并且您需要訪問視圖模型資料,您可以將視圖模型作為引數傳遞或通過其他方式在可組合中訪問它。
除了視圖模型,您可能仍然希望使可組合的有狀態,即使它需要被重用。一個很好的例子是如果您使用的是 TextField。當您輸入文本時,您希望文本出現。如果不使用狀態變數來保留鍵入的字符,您將看不到 TextField 更新。因此,使用區域狀態變數來存盤輸入的字符是可以接受的。雖然這不會使可組合的無狀態,但它仍然是您需要實作的東西。但是,即使在此示例中,您仍然可以通過將鍵入的字符傳回提升函式并將其存盤在視圖模型狀態變數中來使其無狀態,該變數反過來觸發提升函式以重構可組合物件并傳入文本TextField 需要。但這相當復雜,而且只是為了在 TextField 中顯示字符而進行大往返,因此不推薦。但是,如果您有一個非常復雜的 TextField 可組合并且您需要在輸入視圖模型時處理它們中的字符,您可能想要這樣做 - 例如可能是對 url 進行建議查找的情況。
因此,即使您的可組合是無狀態的,但您的視圖模型有一個可變狀態變數,被提升的函式正在觀察,如果該變數的可變狀態發生變化,提升的函式將重新組合。但是被提升的可組合物正在呼叫的可組合物是否被重組取決于該可組合物的引數值是否改變。如果它們發生變化,就會發生重組。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/428144.html
