Recompose 的执行过程
- Recompose Scope 失效,重新生成 Composition 的过程
!! 在 Kotlin 2.0.20 之后,Android 默认开启 强烈跳过
Composable 一定不会跳过重组的情况
-
@Composable
fun composableTest(user: User) {
...
}
data class User(var name: String)
- 如果参数是一个内部参数为可变类型的 data class,对应的Composable 函数就一定会重组
- 原因:Compose 认为可变参数是 不可靠的
什么是稳定的?可靠的?
- 重组:当 Composable 函数读取的 State 或者其他输入发生变化时,Compose 会重新调用该函数更新 UI
- 稳定性:为了优化重组,Compose 需要知道一个类型的实例在其生命周期内是否会改变,以及 equals 方法是否可靠且一致
- 稳定类型:
- 所有的公共属性都是 val 且类型也是稳定的
- equals 方法对于两个相同的实例永远是相同的
- 如:基本数据类型和主构造函数属性都是val的data class
- 或者公开属性为 var 但被 mutableStateOf 代理
- 不稳定类型:
- data class 的主构造参数有 var 或者 mutableState 类型的参数,这个 data class 就被认为是不稳定的
- 所以如果一个 Composable 的参数被判定为不稳定,则在 父 Composable 重组时,该函数一定会重组,即使前后两个实例的 equals 返回 true
@Stable 注解
-
@Composable
fun composableTest(user: User) {
...
}
@Stable
data class User(var name: String)
- @Stable 用来保证被注解的类型是 稳定的,这样,只要 equals 返回 true,就会跳过重组