在 Jetpack Compose 中保留 API

发布: (2025年12月26日 GMT+8 09:05)
4 min read
原文: Dev.to

Source: Dev.to

Cover image for Retain API in Jetpack Compose

🚀 精通 Jetpack Compose 中的 Retain API:为何以及如何重要

在使用 Jetpack Compose 的现代 Android 开发中,有效管理状态——尤其是在配置更改期间——对于构建弹性且流畅的 UI 体验至关重要。Retain API 能帮助你在无需手动保存/恢复逻辑的情况下保留状态。

什么是 Retain API?

Retain API 在 Jetpack Compose 中让您 在配置更改(例如设备旋转)、进程死亡和导航生命周期事件之间 保留状态。与仅在组合生命周期内存在的 remembermutableStateOf 不同,Retain API 将状态绑定到 生命周期所有者(如 ViewModelNavBackStackEntry),确保它在这些事件中仍然存活。

为什么使用 Retain API?

  • 在配置更改时仍能保持(例如,屏幕旋转)
  • 支持进程死亡恢复
  • 可与 ViewModel 和 Navigation 集成
  • onSaveInstanceState 更简洁且更适合 Compose

它简化了状态持久化,无需样板代码,让您专注于构建功能。

Core Concepts

APIPurpose
rememberRetained在组合和配置更改之间持久化状态
RetainedSaveableStateRegistry处理保存/恢复生命周期
SavedStateHandle与 ViewModel 一起使用以实现状态持久化

示例:使用 Retain API 持久化表单状态

未使用 Retain API(问题)

@Composable
fun ProfileForm() {
    var name by remember { mutableStateOf("") }
    var email by remember { mutableStateOf("") }

    Column {
        TextField(value = name, onValueChange = { name = it }, label = { Text("Name") })
        TextField(value = email, onValueChange = { email = it }, label = { Text("Email") })
    }
}

当设备旋转时,状态会丢失。

使用 Retain API

@Composable
fun ProfileFormRetained() {
    val retainedName = rememberRetained { mutableStateOf("") }
    val (name, setName) = retainedName

    val retainedEmail = rememberRetained { mutableStateOf("") }
    val (email, setEmail) = retainedEmail

    Column {
        TextField(value = name, onValueChange = setName, label = { Text("Name") })
        TextField(value = email, onValueChange = setEmail, label = { Text("Email") })
    }
}

现在状态在旋转时仍然保留,并且代码更简洁。

使用 Retain API 与 ViewModel

class ProfileViewModel(
    savedStateHandle: SavedStateHandle
) : ViewModel() {
    var name by savedStateHandle.getState("name") { "" }
    var email by savedStateHandle.getState("email") { "" }
}
@Composable
fun ProfileScreen(vm: ProfileViewModel = hiltViewModel()) {
    Column {
        TextField(
            value = vm.name,
            onValueChange = { vm.name = it },
            label = { Text("Name") }
        )
        TextField(
            value = vm.email,
            onValueChange = { vm.email = it },
            label = { Text("Email") }
        )
    }
}

ViewModel 中使用 SavedStateHandle 存储状态可确保 进程死亡恢复 以及旋转持久化。

最佳实践

  • ✨ 对必须在重组后仍然保留的 UI 状态,优先使用 rememberRetained
  • ✨ 使用 SavedStateHandleViewModel 处理进程死亡和导航状态。
  • ✨ 将保留的状态范围限定在其逻辑所属位置(例如 ViewModel 与 Composable)。

资源链接

  • Android 开发者 — Jetpack Compose 状态与状态提升
  • ViewModel 中的 SavedStateHandle
  • Jetpack Compose API 参考

最后思考

Retain API 是一个底层特性,使真实世界的 Compose 应用更加健壮且易于维护。无论是处理表单、导航状态还是 UI 标记,深入了解如何自信地保留状态,都能提升开发者的生产力和用户体验。

祝你玩得开心! 🎨📱

Back to Blog

相关文章

阅读更多 »