[英]Cannot create an instance of class ViewModel class
Cannot create an instance of class DemoViewModel class
.Cannot create an instance of class DemoViewModel class
。 Here is my code:这是我的代码:
DemoFragment.kt : DemoFragment.kt :
class DemoFragment : Fragment(R.layout.fragment_demo) {
lateinit var mViewModel: DemoViewModel
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
mViewModel=ViewModelProvider(this).get(DemoViewModel::class.java)
mViewModel.getSomeData()
}
}
DemoViewModel.kt : DemoViewModel.kt :
class DemoViewModel(val demoRepository: DemoRepository) : ViewModel() {
fun getSomeData() {
Log.d("DemoViewModel", "${demoRepository.getData()}")
}
}
DemoRepository.kt : DemoRepository.kt :
interface DemoRepository {
fun getData(): Boolean
}
class DemoImpl : DemoRepository {
override fun getData() = false
}
You need to use ViewModelFactory.您需要使用 ViewModelFactory。 Because there is "demoRepository" in your primary builder.
因为您的主要构建器中有“demoRepository”。
class DemoViewModelFactory constructor(private val repository:DemoImpl): ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return if (modelClass.isAssignableFrom(DemoViewModel::class.java!!)) {
DemoViewModel(this.repository) as T
} else {
throw IllegalArgumentException("ViewModel Not Found")
}
}
}
Usage用法
viewModel = ViewModelProvider(this, DemoViewModelFactory(repositoryObject)).get(DemoViewModel::class.java)
I would encourage you to use "by viewModels()" extension function to create viewModel instance easily.我鼓励您使用“by viewModels()”扩展 function 轻松创建 viewModel 实例。 Note that you should add following dependency to use it:
请注意,您应该添加以下依赖项来使用它:
implementation 'androidx.fragment:fragment-ktx:1.2.5'
Sample Fragment Implementation:示例片段实现:
class DemoFragment : Fragment() {
// Use the 'by ViewModels()' Kotlin property delegate
// from the fragment-ktx artifact
private val model: DemoViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
model.selected.observe(viewLifecycleOwner, Observer<Item> { item ->
// Update the UI
})
}
}
Then you can inject an instance of your repository via constructor injection by Dagger or Hilt etc.然后,您可以通过 Dagger 或 Hilt 等的构造函数注入来注入存储库的实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.