“by” the way ——借ViewModel创建方式探索Kotlin的委托机制

文章目录

    • 获取viewModel的新方法
      • 旧方法
      • 新方法
    • 什么是委托模式?
      • 那么委托模式到底是什么呢?
      • 类委托应用场景
      • 属性委托的应用场景
    • “by” 关键字到底是啥
    • 总结

获取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取代了。

IDE提示报错

那么新的写法怎么写呢?

答案如下,这种写法能保证每次获取到的viewModel都是第一次初始化的,从而达到保存数据的作用。

viewModel = ViewModelProvider(this,
        ViewModelProvider.NewInstanceFactory())
        .get(MainViewModel::class.<

你可能感兴趣的:(kotlin,android,java)