Jetpack何时在Composable中创建新的lambda实例



请参阅我的代码:

@Composable
fun RecomposeLambdaTest() {
var state by remember {
mutableStateOf("1")
}
val stateHolder = remember {
StateHolder()
}
Column {
Button(onClick = {
state += "1"
}) {
Text(text = "change the state")
}
OuterComposable(state = state) {
stateHolder// just a reference to the instance outer the scope
}
}
}
@Composable
fun OuterComposable(state: String, onClick: () -> Unit) {
LogUtil.d("lambda hashcode: ${onClick.hashCode()}")
Column {
Text(text = state)
Button(onClick = onClick) {
Log.d("Jeck", "compose 2")
Text(text = "Text")
}
}
}
//@Stable
class StateHolder{
private var b  = 2
}

每次单击按钮,OuterComposable都会重新组合,并记录lambda哈希代码----总是不同的!这意味着每次重新组合时都会创建一个新的lambda实例

我在StateHolder中取消注释代码,使其看起来像:

@Stable
class StateHolder{
private var b  = 2
}

每次单击按钮,OuterComposable都会重新组合,并记录lambda哈希代码----始终不变!这意味着在重新组合时,Composer会重用lambda

引擎盖下面是什么?

编辑:好的,让它更容易,让我们这样更改代码:

val stateHolder = remember {
2
}

结果是lambda被重用。从val到var,每次重新组合时都会创建lambda。

所以我想我知道:如果lambda是一个有价值的外部范围,而有价值的不稳定,那么每次都重新创建lambda。

所以问题是:

  1. Compose编译器为什么要这样做
  2. 为什么编译器认为之前的StateHolder不稳定,它只包含一个私有的var

一位作者也遇到了同样的问题,这是他的文章----6 Jetpack Compose Guidelines to Optimize Your App Performance

他说,私有财产仍然影响稳定,看来这是谷歌团队的选择。

class StateHolder{
private var b  = 2
}

在这个类中,b变量是可变的,任何可变的变量都会使类不稳定。因此,当重新组合时,这个值将改变,因为这是变量

查看此文档了解详细信息

相关内容

  • 没有找到相关文章

最新更新