Android Kotlin 全局共享ViewModel

先上教程,后上思路,有兴趣可以看看后半部分,如果有其他更好的方法,或者这种方法有问题,欢迎指出,一起成长!

这是原本在activity里面获取viewmodel的方法:

val appUserViewModel:AppUserViewModel by viewModels() 

我们不适用kotlin提供的,我们自己写一个:

 val appUserViewModel: = ViewModelLazy(AppUserViewModel::class, { viewModelStore }, {
            defaultViewModelProviderFactory
        }).value

上面的代码就可以在activity里面获取到viewmodel了,通过ViewModelLazy()可以直接获取,其中的参数:

viewModelStore ,defaultViewModelProviderFactory都是可以从AppCompatActivity直接获取!
关键参数就是viewModelStore,我们只要保存第一次获取ViewModel的时候viewModelStore参数就可以共享了。

栗子:

class A:AppCompatActivity(){ // 第一个activity

companion object {
       var viewModelStore2: ViewModelStore? = null
}

 override fun onCreate(savedInstanceState: Bundle?) {
	 ...
	 val appUserViewModel = ViewModelLazy(AppUserViewModel::class, 
	 	{viewModelStore },
	  	{defaultViewModelProviderFactory}
	  ).value
	  viewModelStore2=viewModelStore  // 关键点,保存第一次获取ViewModel的viewModelStore
 	}
}

class B:AppCompatActivity(){ // 第二个activity
	override fun onCreate(savedInstanceState: Bundle?) {
 		val appUserViewModel  = ViewModelLazy(AppUserViewModel::class, 
 			{ MainActivity.viewModelStore2!! }, 
 			{ defaultViewModelProviderFactory}
 		).value
 	}
}

如果使用DataBinding的话,不出意外的单方面更改了,全部页面都会跟着改变了。好了,结束!

思路

其实分析ViewModelLazy类就可以了
在这里插入图片描述

然后我们先记住storeProducer这个类型参数,然后我们分析get()这个方法:
在这里插入图片描述
到这里应该大家都清楚了,mViewModelStore就是刚才的storeProducer,直接调用mViewModelStore的get方法,就可以获取到保存的ViewModel了,如果还不清楚,我们来看一下:ViewModelStore这个类
在这里插入图片描述
这个类内部就只有一个mHap集合,他的ViewModel都是直接存放于mMap,所以我们只要保存第一次获取ViewModel的ViewModelStore,就可以共享了!
如有错误的地方,或者不合理的地方,欢迎指出,一起学习!

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值