@Immutable 在数据类中有哪些好处?

10

看一下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)
        }
    }
}

并附上说明:

将 Person 设为不可变类型,可以在最后一次组合时跳过调用 PersonView 组合函数。

我的问题是:

如果只有当 @Composable 函数的参数发生更改时才会重新组合,并且像上面代码中的 Person(即仅包含原始值的数据类)不能更改而不创建新实例,那么这里的优化在哪里?
与没有 @Immutable 注释的相同代码相比,何时会跳过对 PersonView Composable 函数的调用?它是否与 PeopleView 的可变/不稳定参数 people: List<Person> 有关?

1个回答

10
如果Person类在同一模块中声明,那么有或没有@Immutable都没有区别,因为Compose编译器会自动推断可跳过的Composable。您可以通过生成Compose编译器报告来检查它。
但是,当Person来自多模块应用程序中的另一个模块(或外部库)并且没有@Immutable注释时,则无法推断可跳过的Composable。这个规则有一个例外:如果在其他模块上启用了Compose编译器,则稳定性仍然会被推断。

这与people: List of PeopleView的可变/不稳定参数有关吗?

是的,概念是相同的,这里的List接口不能保证底层列表的不可变性(它可能是MutableList),因此默认情况下List是不可跳过的,并且每次状态更新都会导致重新组合。
好文章:compose-api-guidelines

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接