当前位置: 首页 > 知识库问答 >
问题:

我怎么能告诉匕首刀柄使用我自己的ViewModelFactory而不是默认?

蔡明贤
2023-03-14

代码: 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"
    }
}

画廊简介

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,所以,我搜索了stack overflow,得到了正确的答案,但在我的AS中,当我单击GalleryViewModel时,就会显示这个内置类的用法:GalleryViewModelFactory_Factory,但我想使用自己的自定义类来解决错误。

参考:

>

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

    Android ViewModel没有零参数构造函数

  • 共有1个答案

    杨彦君
    2023-03-14

    如果我没记错的话,在实例化viewmodel时可以传递自定义viewmodelfactory。例如:

    val myViewModel: MyViewModel by viewmodels { myViewModelFactory }
    
     类似资料:
    • 有人能告诉我这个错误是什么意思,这样我就可以避免它了吗?在此处输入图像描述

    • 我使用Dagger-Hilt进行依赖注入,但是我不知道如何在抽象类中进行字段注入。 [DI包] 我使用匕首剑柄(AppModule.kt)将“ErrorHandler”作为单例提供 扩展到BaseUseCase以上的用例都是为匕首剑柄(UseCaseModule.kt)编写的。 > 我尝试使用匕首柄(如BaseUseCaseModule.kt)提供或绑定BaseUseCase类,但是由于它具有类型

    • 问题内容: 我有以下代码 当我使用没有权限的用户时,我得到的不是。 问题答案: 是一个已检查的异常,但它是从未在其子句中声明的方法抛出的(实际上是从拦截该方法的方面)。这是Java中的异常情况,因此您的异常用包裹了,并且未经检查。 要按原样获取您的异常,您可以在方面所拦截的方法的子句中声明它,也可以使用另一个未经检查的异常(即的子类)代替。

    • 问题内容: 函数定义中的下划线是什么意思? 例如 我了解在定义函数时,我可以执行以下操作: 然后,我将其称为而不是,即故意隐藏参数名称吗? 问题答案: Swift需要一个约定来说明函数名称是什么,不仅包括函数名称本身(在括号之前),还包括参数的外部名称。约定是名称后跟冒号。因此,这是一个函数声明(在Swift 2.0中): 这是该函数的名称: 但是,在现实生活中,一个或多个参数有可能(实际上)不会

    • 基于本教程使用Dagger Hilt添加子组件需要 这就是如何创建子组件 我的问题是如何实现 因为它没有显示它是如何提供给UserManager类的 我正在尝试创建一个AppComponent来测试子组件如何与Dagger Hilt一起工作 并在应用中 我应该如何在中创建构建器,创建实现Provider的匿名类不正确吗?

    • 是否可以不仅在WebElement中使用@findby,而且在我自己的类中也使用@findby? 我想有我的类用于与页面元素合作,并在其中重写WebElement接口的一些方法。 但我发现了错误: 您能告诉我重写WebElement方法并使用我的.isdispalyed()方法的正确方法吗?我想继续使用@findby注释。