如果我有一个不可变的值,它被多个可组合对象使用,我应该如何分配这个值?哪个选项更有效。记住是否会给我带来性能增益?这是一个奇怪的问题,但我找不到任何关于它的例子。
我的想法:对于选项1,在每次重组时,示例值将被反复设置为5.dp,我认为这是不必要的,因为它总是5.dp
对于选项2,在第一次重组时,example value将被设置为5.dp,并且不会再被设置。我认为使用remember更有效,但我不确定。
@Composable
fun MyComposable() {
val example = 5.dp //option 1
val example = remember { 5.dp } //option 2
Box(modifier = Modifier
.height(example)
.padding(example)) {
Column {
Text(text = "example", modifier = Modifier.padding(example))
}
}
}
字符串
2条答案
按热度按时间c2e8gylq1#
记得给我业绩收益吗?
号
remember
不应该被用作这样的性能优化,因为它所做的记忆通常是多余的,而@Composable
函数已经做了,这可能比你预期的要多。具体来说,由于
5.dp
只是一个伪装的浮点值,因此选项1更有效。你永远不需要
remember
作为原语(或者像本例中的value class
示例)。这只会消耗内存和时间。.在每次重组时,示例值将被反复设置为5.dp
这是不正确的。在这种情况下,只有初始组合会调用
MyComposable
,它不会被再次调用。这是因为1)它没有参数,所以它总是跳过,2)它没有观察到任何可变状态,所以它永远不会重新启动。它总是会跳过,因为一个可组合的函数在每次调用它时都会跳过与上次调用相同的参数。也就是说,可组合的函数已经被记忆化了,你不需要自己做这件事。
如果可组合函数观察到可变状态发生了变化,它将重新启动。最简单的例子是阅读
mutableStateOf()
的结果,该结果已被分配了一个新值。Compose将重新启动已读取状态发生变化的可组合函数,以确定新的组合应该是什么,以反映变化。如果
MyComposable
被修改为有一个参数,或者它被修改为观察到的可变状态,那么它可以在重组过程中被调用。即使这样,Compose也会通过检查修改器是否产生与上次相同的修改器来尝试在这里变得聪明。这允许Box
和Text
跳过,因为它们的参数都没有改变。好吧,Box
不会跳过,因为它是一个内联函数,但内联的调用会跳过。Compose会记住组合的结果,并且只执行组合中已经改变的部分。如果一个函数的结果,比如
MyComposable
,不能改变,它只会被调用一次。如果它被调用,但是只是调用了具有相同参数的可组合函数,它们会跳过,所以函数会做很少的事情。xmjla07d2#
只需要使用一个瓦尔。它是一个常量。Remember用于当一个值可以更改并且需要在组合之间保存时。