Code: GalleryViewModel
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.switchMap
import androidx.lifecycle.viewModelScope
import androidx.paging.cachedIn
import com.jimmytrivedi.kotlin.imagesearchapp.data.UnsplashRepository
import dagger.assisted.Assisted
import javax.inject.Inject
class GalleryViewModel @Inject constructor(
private val repository: UnsplashRepository,
@Assisted state: SavedStateHandle
) :
ViewModel() {
private val currentQuery = state.getLiveData(CURRENT_QUERY, DEFAULT_QUERY)
val photos = currentQuery.switchMap { queryString ->
repository.getSearchResults(queryString).cachedIn(viewModelScope)
}
fun searchPhotos(query: String) {
currentQuery.value = query
}
companion object {
private const val CURRENT_QUERY = "current_query"
private const val DEFAULT_QUERY = "cats"
}
}
GalleryViewModelFactory
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import javax.inject.Inject
import javax.inject.Provider
import javax.inject.Singleton
@Singleton
class GalleryViewModelFactory @Inject constructor(
private val creators: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
val creator = creators[modelClass] ?: creators.entries.firstOrNull {
modelClass.isAssignableFrom(it.key)
}?.value ?: throw IllegalArgumentException("unknown model class $modelClass")
try {
@Suppress("UNCHECKED_CAST")
return creator.get() as T
} catch (e: Exception) {
throw RuntimeException(e)
}
}
}
Note: Please make sure that it was working till yesterday, and everything is correct only. I just updated some dependecies and I got stuck with Cannot create an instance of class ... ViewModel, So, I searched on stack overflow, and got this proper answer with, but in my AS, when I click on GalleryViewModel, then usage is showing for this in-built class: GalleryViewModelFactory_Factory, but I want to use my own custom class to resolve the errors.
Reference: