SavedState
应用基础 · androidx.savedstate
SavedStateHandle:ViewModel 的恢复状态1.6.0-alpha01
正确创建、观察和限制 SavedStateHandle 中的数据。
最后更新 2026-08-01
复制即用:由宿主绑定
val viewModel = viewModel {
SearchViewModel(
handle = createSavedStateHandle(),
repository = repository,
)
}由宿主绑定的 Handle 才能恢复
生产代码不要直接 SavedStateHandle()。源码明确把公开构造器标为测试用途;直接构造的 handle 没有绑定当前 SavedStateRegistryOwner,进程死亡后不会恢复。
Compose 中可以让 viewModel 创建 lambda 从 CreationExtras 获取绑定后的 handle:
val viewModel = viewModel {
SearchViewModel(
handle = createSavedStateHandle(),
repository = repository,
)
}按 key 读取和观察
class SearchViewModel(
private val handle: SavedStateHandle,
private val repository: SearchRepository,
) : ViewModel() {
val query = handle.getStateFlow("query", "")
fun updateQuery(value: String) {
handle["query"] = value
}
}如果 key 已经有恢复值,getStateFlow 的 initialValue 会被忽略。当前源码还提供 getMutableStateFlow;同一个 key 在 Android 上不要同时混用 MutableStateFlow 与 LiveData 通道。
可序列化对象 delegate
@Serializable
data class SearchFilter(val category: String)
class SearchViewModel(handle: SavedStateHandle) : ViewModel() {
var filter by handle.saved { SearchFilter(category = "all") }
}saved delegate 来自 androidx.lifecycle.serialization,属于当前 2.12.0-alpha01 源码。它让结构化对象恢复更直接,但仍受 SavedState 容量限制。
常见陷阱
- 直接构造
SavedStateHandle():不绑定宿主,进程死亡不恢复。 - 容量超限:SavedState 走 Bundle,大数据(Bitmap/大 List)会 TransactionTooLargeException。
- 混用通道:同一 key 不要同时混用 MutableStateFlow 与 LiveData。
- 非持久状态:SavedStateHandle 只在配置变更/进程重建恢复,不是持久存储。
要点
- 由宿主绑定的 Handle 才能恢复:生产代码不要直接
SavedStateHandle()。源码明确把公开构造器标为测试用途;直接构造的 handle 没有绑定当前SavedStateRegistryOwner,进程死亡后不会恢复。 - 按 key 读取和观察:如果 key 已经有恢复值,
getStateFlow的 initialValue 会被忽略。当前源码还提供getMutableStateFlow;同一个 key 在 Android 上不要同时混用 MutableStateFlo…