SavedStateHandle:ViewModel 的恢复状态 · AndroidX 源码指南
AAndroidX 源码指南
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…

相关页面