繁体   English   中英

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

[英]Jetpack compose when to create a new lambda instance in Composable?

请看我的代码:

@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 recompose,并记录 lambda hashcode——总是不同的,这意味着每次 recompose 时都会创建一个新的 lambda 实例

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

@Stable
class StateHolder{
    private var b  = 2
}

每次我点击按钮, OuterComposable重新组合,并记录 lambda 哈希码——总是相同的,这意味着当重新组合时,Composer 重用 lambda

那么引擎盖下是什么?

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

val stateHolder = remember {
        2
}

结果是 lambda 被重用。 将 val 转换为 var,每次重组时都会创建 lambda。

所以我想我知道:如果 lambda 引用一个有价值的外部 scope 并且有价值的不稳定,每次都重新创建 lambda。

所以问题是:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM