获取viewModel的新方法
旧方法
有新方法肯定要先介绍一下旧方法。
在传统的viewModel获取中,我们都有这样一个经验——不能在Activity里直接创建viewModel对象。因为ViewModel的生命周期是长于Activity的,如果在Activity的方法内直接创建对象,就失去了viewModel的设计意义了,即独立于activity的生命周期,存放activity数据的仓库。
因此,我们要采用一些外部的方法进行初始化。
class MainActivity : AppCompatActivity() {
lateinit var viewModel:MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// ❗ 看下面
viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
// ❗ 看上面
findViewById<Button>(R.id.button).setOnClickListener {
viewModel.printSomething(System.currentTimeMillis().toString())
}
}
}
我们把viewModel定义成一个延迟初始化变量,在onCreate里进行初始化。
有人可能要问了,你这不也是每次重新创建activity时都会调用创建viewModel语句吗?重新创建了里面的数据不也没了?
其实并非如此,而且答案正好回答了为什么不用直接的MainViewModel()
来创建对象。
下面我们来看一下这句初始化代码,这个是摘录《第一行代码Android》(第三版)里的创建viewModel方式
ViewModelProviders.of(this).get(MainViewModel::class.java)
但是实际上这种写法已经被废弃了,查看官网链接可以看到已经被ViewModelProvider取代了。
那么新的写法怎么写呢?
答案如下,这种写法能保证每次获取到的viewModel都是第一次初始化的,从而达到保存数据的作用。
viewModel = ViewModelProvider(this,
ViewModelProvider.NewInstanceFactory())
.get(MainViewModel::class.<