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
相关产品推荐
相关产品推荐

