那么Jetpack Compose在开发中,都有哪些会被使用到的注解?

那么Jetpack Compose在开发中,都有哪些会被使用到的注解? 在 Jetpack Compose 开发中注解Annotations不仅仅是“贴个标签”那么简单。Compose 极其依赖Kotlin 编译器插件这些注解实际上是给编译器下达的指令用来改变代码的底层运行逻辑。除了最基础的 Composable在日常的 Compose 开发中我们还会频繁用到以下几类核心注解。为了方便你理解我将它们分为四大类一、 UI 预览与调试类每天都会用到在写传统的 XML 时我们可以直接看布局预览。但在 Compose 中全都是 Kotlin 代码怎么预览呢这就是下面这两个注解的工作。1. Preview作用告诉 Android Studio“请在右侧的预览面板中把这个 UI 画出来给我看。”特点你可以给它加很多参数比如模拟不同的设备、暗黑模式、不同的语言等。一个组件上可以叠加多个 Preview。代码示例code Kotlindownloadcontent_copyexpand_lessPreview(showBackground true, name 暗黑模式, uiMode Configuration.UI_MODE_NIGHT_YES) Composable fun MyButtonPreview() { // 预览时必须在一个没有参数或参数有默认值的 Composable 中调用 MyButton(text 点击我) }2. PreviewParameter作用如果你想预览的 UI 需要传入大量复杂的假数据比如一个包含几十个字段的商品对象用它可以通过一个提供者Provider把假数据自动“喂”给预览函数。代码示例code Kotlindownloadcontent_copyexpand_lessPreview Composable fun UserCardPreview(PreviewParameter(UserProvider::class) user: User) { UserCard(user) }二、 性能优化与状态标记类进阶必备Compose 有一个核心机制叫智能重组Smart Recomposition当数据改变时它只会刷新用到了该数据的 UI跳过没变化的 UI。为了帮编译器判断“这个数据到底变没变”我们需要用到下面两个极其重要的注解。3. Immutable (绝对不可变)作用向编译器保证这个类的所有属性一旦创建永远不会改变哪怕是内部的嵌套属性也不会变。好处编译器一旦看到这个标记在重组时只要发现对象的引用没换就会直接跳过刷新极大提升性能。代码示例code Kotlindownloadcontent_copyexpand_lessImmutable data class User(val name: String, val age: Int)4. Stable (状态稳定 / 可被监听)作用向编译器保证“虽然这个类里面的数据可能会变但如果变了我一定会主动通知你比如用 MutableState你放心用。”场景通常用在包含 State 的业务逻辑类或接口上。代码示例code Kotlindownloadcontent_copyexpand_lessStable class UiState { var isLoading by mutableStateOf(false) // 数据改变时会通知 Compose }三、 实验性与版本过渡类极其常见Jetpack Compose 发展非常快尤其是在 Material Design 3、Foundation 动画等领域很多新出的 API 官方觉得还不够完美就会标为实验性。5. OptIn(...)作用这是 Kotlin 标准库的注解但在 Compose 里满天飞。它表示“我知道这个功能是不稳定的/实验性的但我同意承担风险并使用它。”常见搭配OptIn(ExperimentalMaterial3Api::class)使用最新的 Material 3 实验性组件如 TopAppBar。OptIn(ExperimentalFoundationApi::class)使用实验性的底层滑动、动画等功能。代码示例code Kotlindownloadcontent_copyexpand_lessOptIn(ExperimentalMaterial3Api::class) Composable fun MyScreen() { Scaffold( topBar { TopAppBar(title { Text(首页) }) } // TopAppBar 在某些版本中需要实验性许可 ) { ... } }四、 底层与编译器优化类写底层库时才会用到这类注解日常开发写业务界面很少直接手写但你在看 Compose 源码时会经常遇到。6. NonRestartableComposable作用告诉编译器“这个函数太简单了不要给它生成那些复杂的‘重组Recomposition’监听代码了。”场景通常用在只做简单包装的函数上比如 Spacer 或者仅仅是把参数传递给另一个组件的壳子函数。代码示例code Kotlindownloadcontent_copyexpand_lessComposable NonRestartableComposable fun MySpacer() { Spacer(modifier Modifier.height(16.dp)) }7. ReadOnlyComposable作用告诉编译器“这个函数里绝对不会创建任何新的 UI 节点它仅仅是用来读取某些全局环境变量CompositionLocal的。”好处极大地精简编译后的代码。场景你常用的 stringResource()、colorResource() 内部就打上了这个注解。 总结对照表注解名称它是干什么用的我多久会用一次Composable声明这是一个画 UI 的函数。每一分钟都在写Preview让 Android Studio 显示界面效果图。每天写新组件时OptIn强行使用一些还在测试中的炫酷新组件。经常尤其用 MD3 时Stable / Immutable解决列表卡顿告诉编译器怎么跳过不需要的刷新。进阶优化时或者写复杂数据模型时ReadOnlyComposable 等底层极致压榨性能。几乎不写系统库写好了给你用