我无法解决这个错误 "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.

因此您可以执行以下选项来解决问题:

  1. 在您的 HomeActivity

    中使用 2 个参数调用超级方法
    class HomeActivity ... {
    ...
        override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
            super.onCreate(savedInstanceState, persistentState) 
            dataBinding.vm = viewModel
        }
    

  1. 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
    }
}