跳转至

通过反射获取 ViewModel

创建 ViewModel

Version 0.5.2

reflectViewModel 通过反射来获取 ViewModel 对象。

定义 ReflectBaseActivity1

abstract class ReflectBaseActivity1<VB : ViewBinding, VM : ViewModel> : AppCompatActivity() {

    // ViewModel
    protected val mViewModel: VM by lazy {
        reflectViewModel(this.javaClass, this)
    }

}

继承 ReflectBaseActivity1

// 声明 ViewModel
// 注意这里是无参数
class ReflectViewModel1() : ViewModel(){
    ... // Content
}

class ReflectActivity1 : ReflectBaseActivity1<ActivityMyBinding, ReflectViewModel1>() {
    ... // Content
}

创建有含参构造函数的 ViewModel

Version 0.5.2

reflectViewModel 默认情况下提供了无参数 ViewModel 构造方法给 ViewModelProvider.Factory ,如果你想传入带参数的 ViewModel ,可以参考下面的示例:

定义 ReflectBaseActivity2 ,并添加一个 createViewModel 方法给 reflectViewModel

abstract class ReflectBaseActivity2<VB : ViewBinding, VM : ViewModel> : AppCompatActivity() {

    // ViewModel
    protected val mViewModel: VM by lazy {
        reflectViewModel(this.javaClass, this) {
            return@reflectViewModel createViewModel(it)
        }
    }

    protected open fun createViewModel(modelClass: Class<out ViewModel>): ViewModel {
        return modelClass.newInstance()
    }

}

继承 ReflectBaseActivity2 ,并重写 createViewModel 方法。

// 声明 ViewModel
// 注意这里有参数
class ReflectViewModel2(val parameter: String) : ViewModel(){
    ... // Content
}

class ReflectActivity2 : ReflectBaseActivity2<ActivityMyBinding, ReflectViewModel2>() {

    override fun createViewModel(modelClass: Class<out ViewModel>): MyViewModel2 {
        return MyViewModel2("这是一个参数")
    }

}

示例代码

示例代码