当我导航至diaryData片段时,应用程序崩溃,并出现java.lang.IllegalArgumentException:未知的ViewModel类错误。主片段和mainviewModel运行正常。在数据片段中,我无法观察在日记数据视图模型中声明的实时数据。
package com.example.mydiary
import android.app.Application
import androidx.lifecycle.*
import com.example.mydiary.ui.main.DiaryItems
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
class DiaryDataViewModel( val diaryKey: Long=0L,val dataSource: DiaryDatabaseDao):ViewModel() {
private val viewModelJob= Job()
private val uiscope= CoroutineScope(Dispatchers.Main+viewModelJob)
private val database=dataSource
private val _diary= MutableLiveData<DiaryItems>()
val diary:LiveData<DiaryItems>
get() = _diary
init {
getCurrentDiary()
}
private fun getCurrentDiary(){
uiscope.launch {
_diary.value=database.get(diaryKey)
}
}
private val _navigateToMain= MutableLiveData<Boolean?>()
val navigateToMain: LiveData<Boolean?>
get()=_navigateToMain
fun doneNavigating(){
_navigateToMain.value=null
}
}
class DiaryDataViewModelFactory(
private val diaryKey:Long,
private val dataSource: DiaryDatabaseDao
) : ViewModelProvider.Factory {
@Suppress("unchecked_cast")
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(DiaryDataViewModel::class.java)) {
return DiaryDataViewModel(diaryKey,dataSource) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
这是我的diaryDataFragment
package com.example.mydiary.ui.main
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.ViewModelProvider
import com.example.mydiary.DiaryDataViewModelFactory
import com.example.mydiary.R
class diaryData : Fragment() {
private lateinit var dataViewModel: DiaryDataViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view= inflater.inflate(R.layout.diary_data_fragment, container, false)
val application = requireNotNull(this.activity).application
var dataSource=DiaryDatabase.getInstance(application).DiaryDatabaseDao
val key= diaryDataArgs.fromBundle(requireArguments()).diakey
val dataViewModelFactory = DiaryDataViewModelFactory(key,dataSource)
dataViewModel = ViewModelProvider(this,dataViewModelFactory).get(DiaryDataViewModel::class.java)
return view
}
}
Logcat的摘录
Process: com.example.mydiary, PID: 27306
java.lang.IllegalArgumentException: Unknown ViewModel class
at com.example.mydiary.DiaryDataViewModelFactory.create(DiaryDataViewModel.kt:45)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
at com.example.mydiary.ui.main.diaryData.onCreateView(diaryData.kt:23)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2224)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1997)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1953)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849)
at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)