我无法解决这个错误 "lateinit property dataBinding has not been initialized"
I cant solve this error "lateinit property dataBinding has not been initialized"
我有基础 activity< T : ViewDataBinding , VM : ViewModel > extends AppCompatActivity()
并且我初始化了视图绑定和视图模型,但是当 运行 应用程序时我收到此错误“lateinit 属性 数据绑定尚未初始化”。 =14=]
我不知道我错过了什么或错了什么
下面是基本 Activity 代码
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
还有这个我的家Activity
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
}
}
this is the error message
当您在 HomeActivity
中调用 super.onCreate(savedInstanceState)
时,会调用 android 的 Activity
中的 onCreate
,但不会调用 [=14] =] 来自 BaseActivity
- 因为它需要第二个参数 persistentState
.
因此您可以执行以下选项来解决问题:
在您的 HomeActivity
中使用 2 个参数调用超级方法
class HomeActivity ... {
...
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
super.onCreate(savedInstanceState, persistentState)
dataBinding.vm = viewModel
}
或
在 BaseActivity
中使用 onCreate
和一个参数
open abstract class BaseActivity<T : ViewDataBinding , VM : ViewModel> : AppCompatActivity() {
lateinit var dataBinding : T
lateinit var viewModel : VM
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
...
因为在您的基础 class 中,带有 2 个参数的 onCreate()
在 activity 的生命周期中不会被调用。在您的 subclass 中,您使用参数覆盖了 onCreate()
。
只需简单地更改您的基础 class 以使用参数覆盖 onCreate()
即可解决问题。另一件事是你实现这些 class java 的方式。
你可以这样让它变得更好:
基类
abstract class BaseActivity<T : ViewDataBinding , VM : ViewModel> : AppCompatActivity() {
protected abstract val dataBinding : T
protected abstract val viewModel : VM
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(dataBinding.root)
}
}
子class:
class HomeActivity : BaseActivity<ActivityHomeBinding, HomeViewModel>() {
override val viewModel get() = ViewModelProvider(this).get(HomeViewModel::class.java)
override val dataBinding get() = ActivityHomeBinding.inflate(layoutInflater)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
dataBinding.vm = viewModel
}
}
我有基础 activity< T : ViewDataBinding , VM : ViewModel > extends AppCompatActivity()
并且我初始化了视图绑定和视图模型,但是当 运行 应用程序时我收到此错误“lateinit 属性 数据绑定尚未初始化”。 =14=]
我不知道我错过了什么或错了什么
下面是基本 Activity 代码
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
还有这个我的家Activity
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
}
}
this is the error message
当您在 HomeActivity
中调用 super.onCreate(savedInstanceState)
时,会调用 android 的 Activity
中的 onCreate
,但不会调用 [=14] =] 来自 BaseActivity
- 因为它需要第二个参数 persistentState
.
因此您可以执行以下选项来解决问题:
在您的
中使用 2 个参数调用超级方法HomeActivity
class HomeActivity ... { ... override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { super.onCreate(savedInstanceState, persistentState) dataBinding.vm = viewModel }
或
在
中使用BaseActivity
onCreate
和一个参数open abstract class BaseActivity<T : ViewDataBinding , VM : ViewModel> : AppCompatActivity() { lateinit var dataBinding : T lateinit var viewModel : VM override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ...
因为在您的基础 class 中,带有 2 个参数的 onCreate()
在 activity 的生命周期中不会被调用。在您的 subclass 中,您使用参数覆盖了 onCreate()
。
只需简单地更改您的基础 class 以使用参数覆盖 onCreate()
即可解决问题。另一件事是你实现这些 class java 的方式。
你可以这样让它变得更好:
基类
abstract class BaseActivity<T : ViewDataBinding , VM : ViewModel> : AppCompatActivity() {
protected abstract val dataBinding : T
protected abstract val viewModel : VM
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(dataBinding.root)
}
}
子class:
class HomeActivity : BaseActivity<ActivityHomeBinding, HomeViewModel>() {
override val viewModel get() = ViewModelProvider(this).get(HomeViewModel::class.java)
override val dataBinding get() = ActivityHomeBinding.inflate(layoutInflater)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
dataBinding.vm = viewModel
}
}