BaseActivity mvvm体系结构android,viewmodel未初始化

时间:2018-10-10 16:15:34

标签: android mvvm data-binding kotlin android-databinding

我正在尝试用这样的代码编写基本活动

abstract class BaseActivity<T : ViewDataBinding, V : BaseViewModel> : AppCompatActivity(), HasSupportFragmentInjector {

val NO_VIEW_MODEL_BINDING_VARIABLE = -1

private lateinit var mViewModel: V
private lateinit var mViewDataBinding: T

@Inject
lateinit var mViewModelFactory : ViewModelProvider.Factory

@Inject
lateinit var mFragmentInjector: DispatchingAndroidInjector<Fragment>

abstract fun getViewModelBindingVariable() : Int

@LayoutRes
abstract fun getLayoutId() : Int

fun getDataBinding() : T {
  return mViewDataBinding
}

fun getViewModel() : V {
    return mViewModel
}


override fun onCreate(savedInstanceState: Bundle?) {
    AndroidInjection.inject(this)
    super.onCreate(savedInstanceState)

    performDataBinding()
    provideViewModel()

}

override fun supportFragmentInjector(): AndroidInjector<Fragment> {
    return mFragmentInjector
}

private fun performDataBinding() {
    mViewDataBinding = DataBindingUtil.setContentView(this, getLayoutId())
    if (getViewModelBindingVariable() != NO_VIEW_MODEL_BINDING_VARIABLE) {
        setViewModelBindingVariable()
    }
}

private fun setViewModelBindingVariable() {
    mViewDataBinding.setVariable(getViewModelBindingVariable(), mViewModel)
    mViewDataBinding.executePendingBindings()
}

private fun provideViewModel() {
    val clazz: Class<V> = getViewModelClass(javaClass)
    mViewModel = ViewModelProviders.of(this, mViewModelFactory).get(clazz)
}

private fun getViewModelClass(aClass: Class<*>): Class<V> {
    val type = aClass.genericSuperclass

    return if (type is ParameterizedType) {
        type.actualTypeArguments[1] as Class<V>
    } else {
        getViewModelClass(aClass.superclass)
    }
}
}

并且我在这里也使用数据绑定,遇到的问题是,当我尝试在xml中引用viewmodel类并通过在getViewModelBindingVariable中使用BR.viewModel返回viewmodel的生成值时,它给出了错误提示

Caused by: kotlin.UninitializedPropertyAccessException: lateinit property mViewModel has not been initialized
    at com.rahmat.app.newsapp.features.base.BaseActivity.setViewModelBindingVariable(BaseActivity.kt:70)
    at com.rahmat.app.newsapp.features.base.BaseActivity.performDataBinding(BaseActivity.kt:65)
    at com.rahmat.app.newsapp.features.base.BaseActivity.onCreate(BaseActivity.kt:53)
    at com.rahmat.app.newsapp.features.main.MainActivity.onCreate(MainActivity.kt:31)

如果我返回NO_VIEW_MODEL_BINDING_VARIABLE,则不会发生此错误,但这使我无法引用我想要的xml中的viewmodel类。我认为我的ProvideViewModel()函数存在一些问题,但我仍然不知道为什么。任何帮助将非常感激。谢谢

0 个答案:

没有答案