@Immutable 对数据类有什么好处?

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是不可跳过的,并且会导致每次状态更新时重新组合。

好读:compose-api-guidelines