看一下documentation of 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.

我的问题是:

If recomposition occurs only when arguments of @Composable function change and data classes like Person in the code above (i.e. containing only primitive vals) cannot be changed without creating a new instance, then what's the optimization here?
When would the calls to the PersonView Composable function be skipped compared to the same code but without the @Immutable annotation? Is it somehow related to the mutable/unstable argument people: List<Person> of PeopleView?

推荐答案

如果在同一模块中声明了Person类,则没有区别(带或不带@Immutable),因为Compose编译器会自动推断Composable是可跳过的.您可以通过生成编写编译器报告来判断它.

然而,当Person来自多模块应用程序中的另一个模块(或来自外部库)并且没有@Immutable注释时,则Composable将不可跳过(无法推断).规则有一个例外:如果在另一个模块上启用了Compose编译器,则无论如何都会推断出 solidity .

它与可变/不稳定的参数People:List of PeopleView有什么关系吗?

是的,概念是相同的,在这里,List接口并不保证底层列表的不变性(它可能是MutableList),所以默认情况下List是不可跳过的,并且导致每次状态更新都会重新组合.

优秀读物:compose-api-guidelines

Android相关问答推荐

将HTML约束布局转换为Jetpack编写约束布局-链样式、偏差

原始mp3文件不显示与proguard

如何将我的Android应用程序(Kotlin)中的图像分享给其他应用程序?

ERR_SSL_VERSION_OR_CIPHER_MISMATCH - Android Webview

从片段导航回来

Visual Studio 2022,毛伊岛,Android Emulator:无法更改内存量

布局可组合项如何具有可测量和约束参数?

如何删除房间数据库?

在 Kotlin 中设置 startActivity() 时类型不匹配

如何像 XML 一样在 Compose Android Studio 中折叠/展开小部件代码区域/区域

每次在 Jetpack Compose 中调用导航

为片段设置主题

viewModel 的可变值状态不起作用

无法解析依赖项'com.github.smarteist:autoimageslider:1.4.0-appcompat'

重命名列失败的房间自动迁移(NOT NULL 约束失败,生成错误的迁移类)

并行运行两个挂起函数并在第一个返回时返回

Android Studio Emulator Internet 连接问题仅是第一次

不能在kotlin的lazycolumn中使用列表

为什么在try 实例化 Mediaplayer 时会出现 NullPointerException?安卓Kotlin

如何从构建的流对象中发出值