Jetpack compose文档表示,如果所有输入都是稳定的并且没有更改,则可以跳过重新组合。类型稳定的定义是这样的。。。
稳定类型必须符合以下合同:
- 对于相同的两个实例,两个实例的equals结果将永远相同
- 如果类型的公共属性发生更改,Composition将收到通知
- 所有公共财产类型也是稳定的
我不能清楚地理解这一点。有人能向我解释一下,如果一个类型是稳定的,如何进行组合检查吗??我可以理解,如果compose确定一个类型是稳定的,那么它将使用equals方法检查是否相等。但是,如何判断一个类是否稳定,以便我们能够理解并尽可能支持智能重组呢?
我试着四处玩耍,发现了以下内容。
This data class Student is not stable, even if I pass the same instance again, its recomposing
data class Student(
var id:Int=1,
var name:String="Anonymous")
然而,当我们再次传递相同的实例时,以下类被视为稳定的,并支持智能重组
This class is stable when all the public parameters are changed to val
data class Student(
val id:Int=1,
val name:String="Anonymous")
所以,我可以理解,所有的公共财产都应该是不可变的。但令我困惑的是,下面的类也被视为稳定类,并倾向于智能重组。为什么?
This MainActivityVM class is considered Stable when passing like
@Composable
fun StudentList(viewModel:MainActivityVM){
...
}
class MainActivityVM : ViewModel() {
val studentNames = mutableStateListOf<Student>()
var textInputDialogState by mutableStateOf(TextInputDialogState())
var publicMutableProperty:String = "This is mutable"
}
所以,我不知道如何为稳定类型编写检查。有人能帮助我理解这一点吗?这样我就可以有效地支持代码中的智能重组了?
我不能清楚地理解这一点。有人能向我解释一下,如果一个类型是稳定的,如何进行组合检查吗??
默认情况下,这些都是稳定的
- 所有基元值类型:Boolean、Int、Long、Float、Char等
- 字符串
- 所有函数类型(lambdas(
Compose编译器查看类,如果其中任何一个字段是,则无法推断该类是稳定的
- 可变(它与var属性相关联(
- 具有非稳定类型(如列表、映射等。默认情况下,所有数据结构都是不稳定的,因为它们不是不可变的,而是只读的(
此外,您可以依赖编译器,让编译器在有疑问时告诉您类的稳定性。
你可以使用
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
kotlinOptions {
freeCompilerArgs += [
"-P",
"plugin:androidx.compose.compiler.plugins.kotlin:reportsDestination=${buildDir}/composeReports"
]
}
}
它将在composeReports中创建类,您可以检查compose是否可以推断稳定性。
stable class YourClass {
stable val value: CornerSize
<runtime stability> = Stable
}
生成的报告将以伪代码格式如上图所示。
https://github.com/androidx/androidx/blob/androidx-main/compose/compiler/design/compiler-metrics.md#classes--classestxt