咨询Android Jetpack Compose中ViewModel的生命周期依赖关系
Compose中ViewModel的生命周期解析
ViewModel的生命周期完全不依赖Composable函数。Composable会因重组(比如状态变化、屏幕旋转)频繁创建和销毁,但ViewModel的核心作用是跨重组、跨配置变更保存数据,所以它的生命周期和Composable的生命周期完全解绑。
ViewModel的生命周期绑定到它的ViewModelStoreOwner(即生命周期所有者),在Compose日常开发中,默认的ViewModelStoreOwner是承载Compose的Activity或Fragment:
- 当你通过Compose的
viewModel()函数获取ViewModel实例时,这个实例会和当前的Activity/Fragment绑定,生命周期与之一致。 - 只有当Activity/Fragment真正被销毁(比如用户退出页面、调用
finish())时,ViewModel才会被清理;像屏幕旋转这类配置变更,Activity会重建,但ViewModel会被保留,不会重新初始化。
- 当你通过Compose的
针对你提到的「整屏Composable传入ViewModel」的场景:
如果你是在Activity的setContent中调用这个Composable,并且通过viewModel()获取ViewModel传入,那么这个ViewModel的生命周期和该Activity完全同步,和Composable的创建/销毁无关——哪怕Composable因为重组多次重建,ViewModel实例始终是同一个,数据也会保留。注意事项:
- 不要手动new ViewModel实例传给Composable,必须用
viewModel()函数获取,这样才能保证ViewModel绑定到正确的生命周期所有者,避免内存泄漏或数据丢失。 - 若需要自定义ViewModel的生命周期范围(比如跨多个页面共享),可以通过自定义ViewModelStoreOwner实现,但日常开发中默认的Activity/Fragment绑定足以满足大部分场景。
- 不要手动new ViewModel实例传给Composable,必须用
内容的提问来源于stack exchange,提问作者Zohaib Akram
相关产品推荐
相关产品推荐

