前言
在jetpack
的開發(fā)中,我們經(jīng)常需要繼承ViewModel
實現(xiàn)自定義ViewModel
,為了方便自定義ViewModel
的的初始化和調(diào)用区匠,這里我繼承ViewModel
封裝了一個公共基類BaseViewModel
,下面就來講講其使用吧。
今天涉及內(nèi)容:
- 為什么要封裝一個
BaseViewModel
-
BaseViewModel
具備的方法 -
BaseViewModel
在MainActivity
中使用 -
BaseViewModel
源碼
一. 為什么要封裝一個BaseViewModel
一般我們繼承ViewModel
實現(xiàn)自定義ViewModel
時可以有多種方式辅愿,大家感興趣的話可參考以下文章
ViewModel的使用
雖然自定義ViewModel
的初始化方式很多忆某,但各有利弊癞埠。初始化簡單的方式存在無法傳值的問題苗踪,而自定義可以傳值的ViewModel
的時候颅夺,其初始化過程有異常繁瑣蛹稍。為了提煉自定義ViewModel
初始化優(yōu)勢且提高編碼效率,于是基類BaseViewModel
誕生了。
二. BaseViewModel 具備的方法
BaseViewModel
作為自定義ViewModel
的基類具備以下方法:
/***
* 獲取Viewmodel對象(工廠模式)
*
* @description: 當viewmodel不需要傳參時可以使用此方法快速實例化
*
* @param owner:要綁定ViewModel的對象
* @param modelClass:具體的ViewModel實現(xiàn)類
*
* @return 返回具體的ViewModel實例
*/
fun <T : ViewModel> getViewModel(owner: ViewModelStoreOwner, modelClass: Class<T>): ViewModel
/***
* 獲取Viewmodel對象(工廠模式)
*
* @description: 用于實例化繼承AndroidViewModel時可用此方法實例化
*
* @param owner:要綁定ViewModel的對象
* @param factory: ViewModel自定義工廠车吹,用于傳參
* @param modelClass:具體的ViewModel實現(xiàn)類
*
* @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:界面?zhèn)鹘oViewModel的數(shù)據(jù)
* @param modelClass:具體的ViewModel實現(xiàn)類
*
* @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
實現(xiàn)自定義ViewModel
的快速初始化秸歧。
fun <T : ViewModel> getViewModel(owner: ViewModelStoreOwner, factory:BaseViewModelFactory?,modelClass: Class<T>):ViewModel
已經(jīng)廢棄(此處列出大家可以看看其初始化的實現(xiàn)),大家涉及到傳值的時候经备,可以用方法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
代碼如下: