无法访问其中声明的viewmodel和实时数据(java.lang.IllegalArgumentException:未知的ViewModel类)

时间:2020-07-08 04:38:05

标签: android sqlite mvvm architecture android-viewmodel

当我导航至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)

0 个答案:

没有答案