繁体   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