美文网首页
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