美文网首页
BaseViewModel优化

BaseViewModel优化

作者: 奔跑的佩恩 | 来源:发表于2023-07-16 10:47 被阅读0次

前言

jetpack的开发中,我们经常需要继承ViewModel实现自定义ViewModel,为了方便自定义ViewModel的的初始化和调用,这里我继承ViewModel封装了一个公共基类BaseViewModel,下面就来讲讲其使用吧。

今天涉及内容:

  1. 为什么要封装一个BaseViewModel
  2. BaseViewModel具备的方法
  3. BaseViewModelMainActivity中使用
  4. 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中使用

继承BaseViewModelActiviy对应的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代码如下:

相关文章

网友评论

      本文标题:BaseViewModel优化

      本文链接:https://www.haomeiwen.com/subject/doqdrdtx.html