运行我的应用程序时出现运行时错误 IllegalArgumentException:没有为给定类设置初始值设定项

问题描述 投票:0回答:1
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mikaai/com.example.mikaai.assistant.Assistantactivity}: 
java.lang.IllegalArgumentException: No initializer set for given class com.example.mikaai.assistant.AssistantViewmodel

这是我遇到的主要错误,应用程序已成功构建,但当我尝试在应用程序中启动活动时它崩溃了,这是它显示的错误。我是 android 的新手,所以我很难理解它。 AssistantViewmodel 有初始化器,但它说没有。如果你知道什么请帮助我并指导我解决这个问题。

我试图重新创建初始化程序,但它仍然表现相同。我尝试在较小的安卓设备上运行应用程序,但它也没有用。

package com.example.mikaai.assistant

import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.MutableLiveData
import com.example.mikaai.data.Assistant
import com.example.mikaai.data.AssistantDao
import kotlinx.coroutines.*

class AssistantViewmodel (
    val database: AssistantDao,
            application: Application) :AndroidViewModel(application)
{
                private var viewModeJob = Job()

    override fun onCleared() {
        super.onCleared()
        viewModeJob.cancel()
    }
//initializer
    init {
        initializeCurrentMessage()
    }

    private val uiScope = CoroutineScope(Dispatchers.Main + viewModeJob)

    private var curreMessage = MutableLiveData<Assistant?>()
    val messages = database.getALLMessages()



    private fun initializeCurrentMessage() {
        uiScope.launch { curreMessage.value = getCurrentMessageFromDatabase() }
    }

    private suspend fun getCurrentMessageFromDatabase(): Assistant?{
        return withContext(Dispatchers.IO){
            var message = database.getCurrentMessage()
            if(message?.assistant_message== "DEFAULT_MESSAGE" || message?.human_message == "DEFAULT_MESSAGE")
            {
                message = null
            }
            message
        }

    }

    fun sendMessageToDatabase(assistantMessage: String, humanMessage: String){
        uiScope.launch {
            val newAssistant= Assistant()
            newAssistant.assistant_message = assistantMessage
            newAssistant.human_message = humanMessage
            insert(newAssistant)
            curreMessage.value=getCurrentMessageFromDatabase()

        }
    }


    private suspend fun insert(message: Assistant){
        withContext(Dispatchers.IO){
            database.insert(message)
        }
    }


    private suspend fun update(message: Assistant){
        withContext(Dispatchers.IO){
            database.update(message)
        }
    }

    fun onClear()
    {
        uiScope.launch { clear()
            curreMessage.value= null}
    }

    private suspend fun clear(){
        withContext(Dispatchers.IO){
            database.clear()
        }
    }

}
android kotlin runtime-error android-appcompat android-viewmodel
1个回答
0
投票

问题在于您尝试在活动中获取视图模型的方式:

assistantViewModel =
    ViewModelProvider(
        this, viewModelFactory {  }
    ).get(AssistantViewmodel::class.java)

你正在使用空工厂,所以当它找不到任何初始化程序时它会抛出

IllegalArgumentException

因为你已经有了视图模型的工厂类(

AssistantViewmodelFactory
),你可以用它代替
viewModelFactory {  }
。或者,您可以像这样将初始化程序添加到匿名视图模型工厂:

viewModelFactory { 
    addInitializer(AssistantViewmodel::class) { 
        AssistantViewmodel(dataSoure, application)
    }
}

再次阅读您的代码后,我想我知道您是如何到达这里的:您的工厂变量名为

ViewModelFactory
,首字母大写。同时,生命周期库中有一个名为
viewModelFactory
的方法,首字母较小。一个错字和一个导入之后你会得到非常混乱的行为。

© www.soinside.com 2019 - 2024. All rights reserved.