1. 从“手搓”到“躺平”:by viewModels() 带来的开发体验革新
如果你写过几年Android,肯定对ViewModel不陌生。这东西确实好用,屏幕一转,数据还在,省去了我们手动保存和恢复状态的麻烦。但回想一下以前是怎么获取ViewModel实例的?是不是得在Activity或者Fragment里写这么一坨代码:
class MyOldActivity : AppCompatActivity() {
private lateinit var viewModel: MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
// 然后才能开始用
}
}
每次都要手动调用 ViewModelProvider,还要传 this 和那个 ::class.java,写多了真的烦。而且这还只是最简单的场景,要是你想用自定义的 Factory 来构造ViewModel,代码就更啰嗦了。我刚开始用ViewModel的时候,经常在想,有没有更优雅、更Kotlin的方式?
答案就是 by viewModels()。这玩意儿第一次用的时候,我真的有种“原来还能这样”的感觉。它本质上是一个Kotlin的属性委托,把创建和获取ViewModel实例这个脏活累活全给包了。你只需要在属性声明的时候加上 by viewModels(),剩下的它来搞定。代码瞬间就清爽了:
class MyActivity : AppCompatActivity() {
// 看,一行搞定,类型还是安全的
private val myViewModel: MyViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 直接就能用,myViewModel已经准备好了
myViewModel.someLiveData.observe(this) { data ->
// 更新UI
}
}
}
这种写法不仅仅是代码变短了,更重要的是它符合Kotlin“简洁即正义”的哲学。它把声明和初始化合二为一,消除了 lateinit 带来的潜在空指针风险(你肯定不想在 onCreate 里忘了初始化ViewModel吧?)。而且,它的类型是推断出来的,编译器会帮你检查,如果你把 MyViewModel 写成了 YourViewModel,编译阶段就会报错,这比运行时才崩溃要友好太多了。
我印象很深,有个刚转Android开发的朋友,我让他用 by viewModels(),他用了半天跑过来问我:“哥,这ViewModel到底是在哪初始化的?我怎么没看到 new 或者 get 的调用?” 我告诉他,这就是属性委托的魔法,你把初始化逻辑“委托”给了 viewModels() 这个函数,它会在你第一次访问这个属性的时候,按需帮你创建好实例。这种“懒加载”的特性,对于性能其实也有好处,避免了一些不必要的提前初始化。
所以,by viewModels() 绝不是一个简单的语法糖。它是将Android官方架构组件与Kotlin语言特性深度结合的一个典范,真正让ViewModel的使用变得“无感”和“自然”,让我们能把精力更集中在业务逻辑本身,而不是这些模板代码上。从“手搓”到“躺平”,体验的提升是实实在在的。
2. 手把手入门:5分钟搞定你的第一个 by viewModels()
光说感觉好没用,咱们得来点实际的。我保证,就算你之前从来没碰过 by viewModels(),跟着下面这几步走,5分钟内绝对能在你的项目里跑起来。
2.1 环境与依赖:打好地基
首先,别急着写代码。by viewModels() 这个扩展函数不是凭空变出来的,它藏在一些特定的Kotlin扩展库里。你得先把这些“工具”请到你的项目里。
打开你的 app模块下的 build.gradle.kts (如果是Groovy DSL就是 build.gradle),在 dependencies 块里,确保添加了以下依赖:
dependencies {
// 核心依赖,包含了 viewModels() 扩展函数
implementation("androidx.activity:activity-ktx:1.8.0")
// 或者,如果你在Fragment里用:
implementation("androidx.fragment:fragment-ktx:1.6.1")
// ViewModel 本身的依赖(通常已经有了)
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2")
}
注意看这里:activity-ktx 和 fragment-ktx 是关键!by viewModels() 就是由它们提供的。版本号不用死记我写的这个,你可以去Android开发者官网看最新的稳定版。但有个坑我得提醒你:这几个库的版本最好和你的 lifecycle 等基础架构组件版本保持大致同步,避免一些潜在的兼容性问题。我吃过亏,版本乱配导致编译不过,查了半天。
添加完依赖,点击一下Gradle同步(那个大象图标)。看到同步成功,咱们的地基就算打好了。
2.2 基础用法:在Activity和Fragment中的实战
依赖搞定,现在可以写代码了。咱们先来个最简单的场景。
第一步,定义你的ViewModel。 这个和以前没区别:
import androidx.lifecycle.ViewModel
import androidx.lifecycle.MutableLiveData
class MySimpleViewModel : ViewModel() {
// 一个简单的数据
val welcomeText = MutableLiveData<String>().apply {
value = "Hell


383

被折叠的 条评论
为什么被折叠?



