簡體   English   中英

你能給我一些示例代碼來證明從不依賴執行可組合函數的副作用嗎?

[英]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.

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