Kotlin中viewModel by viewModels<ProductsVM>()的by关键字作用及代码原理
聊聊
val viewModel by viewModels<ProductsVM>()里的by关键字和代码逻辑 一、by关键字的作用
在Kotlin中,by是委托属性的核心关键字,作用就是把属性的存取逻辑(get()/set())委托给另一个对象来实现,不用自己手动编写这部分代码。这里就是将viewModel属性的获取逻辑,交给viewModels()返回的委托对象处理。
二、代码的工作原理与执行过程
第一步:
viewModels()的角色viewModels()是Android Jetpack提供的扩展函数,它会返回一个专门管理ViewModel的委托对象,这个对象负责处理ViewModel的实例创建、生命周期绑定等工作。首次访问
viewModel属性时- 委托对象会先检查当前组件(Activity/Fragment)对应的
ViewModelStore中,是否已经存在ProductsVM的实例; - 如果存在,直接返回该实例,确保整个组件生命周期内
ViewModel的唯一性; - 如果不存在,就通过
ViewModelProvider结合默认工厂类创建ProductsVM的新实例,将其存入ViewModelStore后再返回给调用者。
- 委托对象会先检查当前组件(Activity/Fragment)对应的
后续访问
viewModel属性时
直接从ViewModelStore中取出已有的ProductsVM实例,不会重复创建,既节省资源又能保留之前的数据状态。生命周期绑定的核心
ViewModelStore与组件的生命周期绑定,当组件因配置变更(如屏幕旋转)重建时,ViewModelStore中的实例不会被销毁,新组件实例可以直接获取到原有的ViewModel,从而保留业务数据不丢失。
内容的提问来源于stack exchange,提问作者cluster1
相关产品推荐
相关产品推荐

