[英]Could you give me some sample code to prove Never depend on side-effects from executing composable functions?
以下內容來自文章。
永遠不要依賴於執行可組合函數的副作用,因為函數的重組可能會被跳過。 如果您這樣做,用戶可能會在您的應用中遇到奇怪且不可預測的行為。 副作用是對您的應用程序的其余部分可見的任何更改。 例如,這些動作都是危險的副作用:
Writing to a property of a shared object
Updating an observable in ViewModel
Updating shared preferences
它說有三種情況會導致跳過重組,但它沒有給我示例代碼。
特別是,我將可觀察到的LiveData
轉換為用於 Compose 的State<T>
,當LiveData
的值更新時,UI 將自動更新!
你能給我一些示例代碼來證明從不依賴執行可組合函數的副作用嗎?
我不知道 Jetpack,但我認為這個想法是 UI 刷新只會由State
更改觸發。 換句話說,只有依賴於State
Composable
函數才會更新。
好的(如果我們提取狀態和回調會更好,但僅用於示例) :
@Composable
fun Example() {
var counter by remember { mutableStateOf(0) }
Row {
Text(counter.toString())
Checkbox(checked = value, onCheckedChange = { counter++ })
}
}
不良副作用:
object GlobalCounterState {
var counter = 0
}
@Composable
fun Example() {
Row {
Text(GlobalCounterState.counter.toString())
Checkbox(checked = value, onCheckedChange = { GlobalCounterState.counter++ })
}
}
副作用是任何離開函數作用域的東西。 例如,外部突變(如上例中)或 UI 更改(如調用 Toast/Snackbar)或清除一次性/訂閱。 在 JetPack Composable
函數可以隨時重新運行任意次數。 它需要是純粹的和確定性的。 意思是,給定相同的輸入,無論調用 10 次還是 1000 次,效果或結果都必須相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.