在 Jetpack Compose 中保留 API
Source: Dev.to

🚀 精通 Jetpack Compose 中的 Retain API:为何以及如何重要
在使用 Jetpack Compose 的现代 Android 开发中,有效管理状态——尤其是在配置更改期间——对于构建弹性且流畅的 UI 体验至关重要。Retain API 能帮助你在无需手动保存/恢复逻辑的情况下保留状态。
什么是 Retain API?
Retain API 在 Jetpack Compose 中让您 在配置更改(例如设备旋转)、进程死亡和导航生命周期事件之间 保留状态。与仅在组合生命周期内存在的 remember 或 mutableStateOf 不同,Retain API 将状态绑定到 生命周期所有者(如 ViewModel 或 NavBackStackEntry),确保它在这些事件中仍然存活。
为什么使用 Retain API?
- ✅ 在配置更改时仍能保持(例如,屏幕旋转)
- ✅ 支持进程死亡恢复
- ✅ 可与 ViewModel 和 Navigation 集成
- ✅ 比
onSaveInstanceState更简洁且更适合 Compose
它简化了状态持久化,无需样板代码,让您专注于构建功能。
Core Concepts
| API | Purpose |
|---|---|
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。 - ✨ 使用
SavedStateHandle与ViewModel处理进程死亡和导航状态。 - ✨ 将保留的状态范围限定在其逻辑所属位置(例如 ViewModel 与 Composable)。
资源链接
- Android 开发者 — Jetpack Compose 状态与状态提升
- ViewModel 中的 SavedStateHandle
- Jetpack Compose API 参考
最后思考
Retain API 是一个底层特性,使真实世界的 Compose 应用更加健壮且易于维护。无论是处理表单、导航状态还是 UI 标记,深入了解如何自信地保留状态,都能提升开发者的生产力和用户体验。
祝你玩得开心! 🎨📱