前言
在jetpack
的开发中,我们经常需要继承ViewModel
实现自定义ViewModel
,为了方便自定义ViewModel
的的初始化和调用,这里我继承ViewModel
封装了一个公共基类BaseViewModel
,下面就来讲讲其使用吧。
今天涉及内容:
- 为什么要封装一个
BaseViewModel
-
BaseViewModel
具备的方法 -
BaseViewModel
在MainActivity
中使用 -
BaseViewModel
源码
一. 为什么要封装一个BaseViewModel
一般我们继承ViewModel
实现自定义ViewModel
时可以有多种方式,大家感兴趣的话可参考以下文章
ViewModel的使用
虽然自定义ViewModel
的初始化方式很多,但各有利弊。初始化简单的方式存在无法传值的问题,而自定义可以传值的ViewModel
的时候,其初始化过程有异常繁琐。为了提炼自定义ViewModel
初始化优势且提高编码效率,于是基类BaseViewModel
诞生了。
二. BaseViewModel 具备的方法
BaseViewModel
作为自定义ViewModel
的基类具备以下方法:
/***
* 获取Viewmodel对象(工厂模式)
*
* @description: 当viewmodel不需要传参时可以使用此方法快速实例化
*
* @param owner:要绑定ViewModel的对象
* @param modelClass:具体的ViewModel实现类
*
* @return 返回具体的ViewModel实例
*/
fun <T : ViewModel> getViewModel(owner: ViewModelStoreOwner, modelClass: Class<T>): ViewModel
/***
* 获取Viewmodel对象(工厂模式)
*
* @description: 用于实例化继承AndroidViewModel时可用此方法实例化
*
* @param owner:要绑定ViewModel的对象
* @param factory: ViewModel自定义工厂,用于传参
* @param modelClass:具体的ViewModel实现类
*
* @return 返回具体的ViewModel实例
*/
@Deprecated("当前方法废弃了,请使用 getViewModel2(...)",
ReplaceWith("getViewModel2(owner: ViewModelStoreOwner, savedInstanceState: Bundle?,any: Any?,modelClass: Class<T>)"),
DeprecationLevel.WARNING
)
fun <T : ViewModel> getViewModel(owner: ViewModelStoreOwner, factory:BaseViewModelFactory?,modelClass: Class<T>):ViewModel
/***
* 获取Viewmodel对象(工厂模式)
*
* @description: 自定义工厂方式ViewModel实例化
*
* @param owner:要绑定ViewModel的对象
* @param savedInstanceState: Bundle
* @param any:界面传给ViewModel的数据
* @param modelClass:具体的ViewModel实现类
*
* @return 返回具体的ViewModel实例
*/
fun <T : ViewModel> getViewModel2(owner: ViewModelStoreOwner, savedInstanceState: Bundle?,any: Any?,modelClass: Class<T>):ViewModel
其中,当我们自定义的ViewModel
无需涉及传值的时候,可以用
fun <T : ViewModel> getViewModel(owner: ViewModelStoreOwner, modelClass: Class<T>): ViewModel
实现自定义ViewModel
的快速初始化。
fun <T : ViewModel> getViewModel(owner: ViewModelStoreOwner, factory:BaseViewModelFactory?,modelClass: Class<T>):ViewModel
已经废弃(此处列出大家可以看看其初始化的实现),大家涉及到传值的时候,可以用方法fun <T : ViewModel> getViewModel2(owner: ViewModelStoreOwner, savedInstanceState: Bundle?,any: Any?,modelClass: Class<T>):ViewModel
初始化自定义ViewModel
。
三. BaseViewModel 在 MainActivity中使用
继承BaseViewModel
写Activiy
对应的MainViewModel
:
/**
* Title:
* description:
* autor:pei
* created on 2023/3/16
*/
class MainViewModel : BaseViewModel {
constructor()
constructor(savedInstanceState: Bundle?, any: Any?) : super(savedInstanceState, any)
}
在MainActivity
中初始化MainViewModel
:
class MainActivity : AppCompatActivity(), View.OnClickListener {
private lateinit var mainViewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//mainViewModel初始化
mainViewModel = BaseViewModel.getViewModel2(
this@MainActivity,
savedInstanceState,
"小学",
MainViewModel::class.java
) as MainViewModel
//其他代码省略
//......
}
override fun onClick(v: View) {
when (v.id) {
R.id.button -> {
mainViewModel.mAny?.let {
mBinding.textView.text = it.toString()
}
}
}
}
}
四. BaseViewModel 源码
BaseViewModel
代码如下:
网友评论