BaseActivity mvvm архитектура android, viewmodel не инициализирован - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь написать базовое действие с кодом, подобным этому

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)
    }
}
}

, и я также использую привязку данных здесь, проблема, с которой я сталкиваюсь, всякий раз, когда я пытаюсь ссылаться на класс viewmodel в моем xml и возвращатьсгенерировало значение viewmodel с помощью BR.viewModel в getViewModelBindingVariable, оно выдало ошибку, говорящую, что

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, но из-за этого я не могу ссылаться на класс viewmodel, который я хочу вмой xml.Я думаю, что есть какая-то проблема в моей функции provideViewModel (), но я до сих пор не знаю почему.Любая помощь приветствуется.спасибо

...