简体   繁体   English

无法创建 class ViewModel class 的实例

[英]Cannot create an instance of class ViewModel class

  • I am trying to follow MVVM pattern in my Android app but getting error while creating an instance of ViewModel.我试图在我的 Android 应用程序中遵循 MVVM 模式,但在创建 ViewModel 实例时出错。
  • Error: 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM