I have base activity< T : ViewDataBinding , VM : ViewModel > extends AppCompatActivity()
and i initialize view binding and view model but when run the app i get this error "lateinit property dataBinding has not been initialized"
I don’t know what I miss or what the wrong
Below is Base Activity Code
open abstract class BaseActivity<T : ViewDataBinding , VM : ViewModel> : AppCompatActivity() {
lateinit var dataBinding : T
lateinit var viewModel : VM
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
super.onCreate(savedInstanceState, persistentState)
dataBinding = getViewBinding()
setContentView(dataBinding.root)
viewModel = generateViewModel()
}
abstract fun getViewBinding(): T
abstract fun generateViewModel(): VM
and this My HomeActivity
class HomeActivity : BaseActivity<ActivityHomeBinding, HomeViewModel>() {
override fun getViewBinding(): ActivityHomeBinding = ActivityHomeBinding.inflate(layoutInflater)
override fun generateViewModel(): HomeViewModel {
return ViewModelProvider(this).get(HomeViewModel::class.java)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
dataBinding.vm = viewModel
}
}
2
Answers
When you are calling
super.onCreate(savedInstanceState)
in yourHomeActivity
, theonCreate
from android’sActivity
is called, but not theonCreate
fromBaseActivity
– because it expected second parampersistentState
.So you can do this options to fix the issue:
call super method with 2 params in your
HomeActivity
OR
use
onCreate
with one param in yourBaseActivity
Because in your base class the
onCreate()
with 2 parameters is not going to get called during the activity’s lifecycles. And in your subclass you override theonCreate()
with a parameter.Just simple change your base class to override the
onCreate()
with a parameter to fix the problem. And the other thing is you implement these class the java’s way.You can just make it better this way:
BaseClass
Subclass: