You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose中hiltViewModel的生命周期是怎样的?

问题

在Activity或Fragment中使用ViewModel时,其生命周期与对应组件的生命周期保持一致,这一点十分明确。但Jetpack Compose中的hiltViewModel函数的生命周期情况如何?我查找了许久未找到相关文档,请问如下示例中BleViewModel.onCleared何时会被调用?

@Composable
fun BleControl() {
    val viewModel = hiltViewModel<BleViewModel>()
    //...
}
回答

hiltViewModel()创建的ViewModel生命周期绑定规则分两种场景:

  • 未使用Jetpack Navigation的情况:ViewModel的生命周期与承载该Composable的宿主组件(Activity或Fragment)完全一致,onCleared()会在宿主Activity/Fragment销毁时被调用。比如如果BleControl是直接写在Activity的setContent块里,那只有当Activity被销毁时,BleViewModel的onCleared()才会触发。
  • 使用Jetpack Navigation的情况:ViewModel会绑定到当前Composable所在的NavBackStackEntry的生命周期。此时onCleared()会在以下时机触发:
    • 从当前导航目的地返回(比如按返回键),该目的地从导航栈中弹出时;
    • 导航到新的目的地且当前目的地被从栈中移除(比如使用popUpTo并设置inclusive = true)时。

需要注意的是,Composable的重组、临时隐藏(比如被其他Composable覆盖)都不会触发onCleared(),只有当ViewModel绑定的生命周期所有者(宿主组件或NavBackStackEntry)被销毁时,才会调用这个方法。

内容的提问来源于stack exchange,提问作者Semyon Tikhonenko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 08:47:03