如何告诉匕首刀柄使用我自己的 ViewModelFactory 而不是默认值?

时间:2021-02-27 06:00:10

标签: android kotlin dagger-hilt

代码: 画廊视图模型

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)
        }

    }
}

注意:请确保它一直工作到昨天,并且一切都是正确的。我刚刚更新了一些依赖项,但遇到了无法创建类的实例... ViewModel,因此,我搜索了堆栈溢出,并得到了正确的答案,但是在我的 AS 中,当我单击 GalleryViewModel,然后显示此内置类的用法:GalleryViewModelFactory_Factory,但我想使用我自己的自定义类来解决错误。

参考:

  1. https://github.com/android/architecture-components-samples/blob/d7cd7a9414ef1eeba52a79ec76f6d9827cd50a36/GithubBrowserSample/app/src/main/java/com/android/example/github/viewmodel/GithubViewModelFactory.kt

  2. Android ViewModel has no zero argument constructor

1 个答案:

答案 0 :(得分:0)

如果我没记错的话,您可以在实例化视图模型时传递自定义视图模型工厂。例如:

val myViewModel: MyViewModel by viewmodels { myViewModelFactory }