先上教程,后上思路,有兴趣可以看看后半部分,如果有其他更好的方法,或者这种方法有问题,欢迎指出,一起成长!
这是原本在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,就可以共享了!
如有错误的地方,或者不合理的地方,欢迎指出,一起学习!