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

获取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.<
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值