dom*_*nik 10 android android-jetpack-compose compose-recomposition
查看Immutable 的文档,有一个代码示例:
@Immutable
data class Person(val name: String, val phoneNumber: String)
@Composable
fun PersonView(person: Person) {
Column {
Row {
Text("Name: ")
Text(person.name)
}
Row {
Text("Phone: ")
Text(person.phoneNumber)
}
}
}
@Composable
fun PeopleView(people: List<Person>) {
Column {
for (person in people) {
PersonView(person)
}
}
}
Run Code Online (Sandbox Code Playgroud)
和标题:
如果将 Person 标记为不可变,则如果与上次合成期间是同一个人,则可以跳过调用 PersonView Composable 函数。
我的问题是:
如果重组仅在函数参数@Composable更改时发生,并且像上面的代码中那样的数据类Person(即仅包含原始值)不能在不创建新实例的情况下更改,那么这里的优化是什么?与没有注释
的相同代码相比,什么时候会跳过对 PersonView Composable 函数的调用?它是否与 的可变/不稳定参数有关?@Immutablepeople: List<Person>PeopleView
Der*_*k K 11
如果Person类在同一个模块中声明,则没有区别(带或不带 )@Immutable,因为 Compose 编译器会自动推断 Composable 是可跳过的。您可以通过生成 Compose 编译器报告来检查它。
但是,当Person来自多模块应用程序中的另一个模块(或来自外部库)并且没有注释时@Immutable,则可组合项将不可跳过(无法推断)。该规则有一个例外:如果在其他模块上启用了 Compose 编译器,则无论如何都会推断出稳定性。
它是否与可变/不稳定参数 people: List of PeopleView 有关?
是的,概念是相同的,这里的List接口不保证底层列表的不变性(可能是MutableList),因此默认情况下List是不可跳过的,并且会导致每次状态更新时重新组合。
| 归档时间: |
|
| 查看次数: |
778 次 |
| 最近记录: |