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()
}
}
}
问题在于您尝试在活动中获取视图模型的方式:
assistantViewModel =
ViewModelProvider(
this, viewModelFactory { }
).get(AssistantViewmodel::class.java)
你正在使用空工厂,所以当它找不到任何初始化程序时它会抛出
IllegalArgumentException
。
因为你已经有了视图模型的工厂类(
AssistantViewmodelFactory
),你可以用它代替viewModelFactory { }
。或者,您可以像这样将初始化程序添加到匿名视图模型工厂:
viewModelFactory {
addInitializer(AssistantViewmodel::class) {
AssistantViewmodel(dataSoure, application)
}
}
再次阅读您的代码后,我想我知道您是如何到达这里的:您的工厂变量名为
ViewModelFactory
,首字母大写。同时,生命周期库中有一个名为viewModelFactory
的方法,首字母较小。一个错字和一个导入之后你会得到非常混乱的行为。