我有基本活動< T : ViewDataBinding , VM : ViewModel > extends AppCompatActivity()
我初始化了視圖系結和視圖模型,但是當運行應用程式時我得到這個錯誤“ lateinit property dataBinding has not been initialized ”
我不知道我想念什么或哪里錯了
以下是基本活動代碼
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
還有這個我的 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
}
}
這是錯誤資訊
uj5u.com熱心網友回復:
因為在您的基類中onCreate(),在活動的生命周期中不會呼叫帶有 2 個引數的引數。在您的子類中,您onCreate()使用引數覆寫 。
只需簡單地更改您的基類以onCreate()使用引數覆寫來解決問題。另一件事是你以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 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
}
}
uj5u.com熱心網友回復:
當您呼叫super.onCreate(savedInstanceState)時HomeActivity,呼叫onCreatefrom android Activity,但不呼叫onCreatefrom BaseActivity- 因為它需要第二個引數persistentState。
因此,您可以執行此選項來解決問題:
用你的 2 個引數呼叫超級方法
HomeActivityclass HomeActivity ... { ... override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { super.onCreate(savedInstanceState, persistentState) dataBinding.vm = viewModel }
或者
onCreate與您的一個引數一起使用BaseActivityopen abstract class BaseActivity<T : ViewDataBinding , VM : ViewModel> : AppCompatActivity() { lateinit var dataBinding : T lateinit var viewModel : VM override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ...
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/468690.html
上一篇:macOS沙盒應用程式,無法將桌面檔案夾內的檔案復制到臨時目錄
下一篇:完全錯誤:在org.gradle.api.internal.artifacts.dsl.dependencies.Def型別的物件上找不到引數[directory'libs']的方
