【问题标题】:java.lang.RuntimeException: Cannot create an instance of class com.example.mvvmapp.NoteViewModel in koltlinjava.lang.RuntimeException:无法在 koltlin 中创建 com.example.mvvmapp.NoteViewModel 类的实例
【发布时间】:2021-06-13 07:43:42
【问题描述】:

错误:无法创建视图模型类的实例

这是我尝试创建它的方式

class MainActivity : AppCompatActivity() {
    lateinit var noteViewModel: NoteViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        noteViewModel = ViewModelProvider(
            this,
            ViewModelProvider.AndroidViewModelFactory.getInstance(this.application)
        ).get(
            NoteViewModel::class.java
        )

        noteViewModel.getAllNotes().observe(this, object : Observer<List<Note>> {
            override fun onChanged(t: List<Note>?) {
                Toast.makeText(this@MainActivity, t.toString(), Toast.LENGTH_LONG).show()
            }
        })
    }
}

这是我的视图模型类

class NoteViewModel(application: Application) : AndroidViewModel(application) {
    private val repository: NoteRepository = NoteRepository(application)
    private val allNotes: LiveData<List<Note>> = repository.getAllNotes()

    fun insert(note: Note) {
        repository.insert(note)
    }

    fun delete(note: Note) {
        repository.delete(note)
    }

    fun update(note: Note) {
        repository.update(note)
    }

    fun deleteAll() {
        repository.deleteAllNotes()
    }

    fun getAllNotes(): LiveData<List<Note>> = allNotes
}

一切看起来都很好,我不知道是什么导致了错误

【问题讨论】:

  • 看看this,它可以帮助您了解如何初始化ViewModel

标签: android kotlin mvvm viewmodel android-viewmodel


【解决方案1】:

您可以使用 kotlin 属性委托“viewModels()”来实例化您的视图模型

class MainActivity : AppCompatActivity() {
 var noteViewModel: NoteViewModel by viewModels()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    noteViewModel.getAllNotes().observe(this, object : Observer<List<Note>> {
        override fun onChanged(t: List<Note>?) {
            Toast.makeText(this@MainActivity, t.toString(), Toast.LENGTH_LONG).show()
        }
    })
}

}

【讨论】:

    【解决方案2】:

    尝试使用以下依赖项,然后您将能够在您的活动中获得 kotlin 属性委托“viewModels()”。

    dependencies {
        val lifecycle_version = "2.3.1"
        val arch_version = "2.1.0"
    
        // ViewModel
        implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version")
        // LiveData
        implementation("androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version")
        // Lifecycles only (without ViewModel or LiveData)
        implementation("androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version")
    
        // Saved state module for ViewModel
        implementation("androidx.lifecycle:lifecycle-viewmodel-savedstate:$lifecycle_version")
    
       implementation "androidx.activity:activity-ktx:1.3.0-beta01"
    
        }
    
    
    //write below code in your activity for instantiate viewModel
     private val noteViewModel: NoteViewModel by viewModels()
    
    
    //For more detail go through below link
     https://developer.android.com/jetpack/androidx/releases/lifecycle#declaring_dependencies
    

    【讨论】:

    • 我在最后添加了一个依赖,它现在可以工作了
    【解决方案3】:

    我有同样的问题(在 java 中)。这解决了它:

    // 旧代码

    mWordViewModel = new ViewModelProvider(this).get(WordViewModel.class);

    // 新代码

    mWordViewModel = new ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication())).get(WordViewModel.class);

    【讨论】:

      【解决方案4】:

      如果有人遇到这个问题,解决这个问题的一种方法就是公开 ViewModel 构造函数(扩展 AndroidViewModel 的类)

      【讨论】:

        猜你喜欢
        • 2020-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-11
        • 1970-01-01
        • 1970-01-01
        • 2011-09-09
        • 2014-05-07
        相关资源
        最近更新 更多