无法创建类 ViewModel 类的实例

时间:2020-12-31 17:19:34

标签: android kotlin android-viewmodel android-mvvm

  • 我试图在我的 Android 应用中遵循 MVVM 模式,但在创建 ViewModel 实例时出错。
  • 错误:Cannot create an instance of class DemoViewModel class

这是我的代码:

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

class DemoViewModel(val demoRepository: DemoRepository) : ViewModel() {

    fun getSomeData() {
        Log.d("DemoViewModel", "${demoRepository.getData()}")
    }
}

DemoRepository.kt

interface DemoRepository {
    fun getData(): Boolean
}

class DemoImpl : DemoRepository {
    override fun getData() = false
}

2 个答案:

答案 0 :(得分:1)

您需要使用 ViewModelFactory。因为您的主要构建器中有“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")
        }
    }
}

用法

viewModel = ViewModelProvider(this, DemoViewModelFactory(repositoryObject)).get(DemoViewModel::class.java)

答案 1 :(得分:1)

我鼓励您使用“by viewModels()”扩展函数来轻松创建 viewModel 实例。请注意,您应该添加以下依赖项才能使用它:

implementation 'androidx.fragment:fragment-ktx:1.2.5'

示例片段实现:

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
      })
   }
}

然后,您可以通过 Dagger 或 Hilt 等构造函数注入来注入存储库的实例。

相关问题