android 将 hilt 注入 ViewModel

android hilt Inject into ViewModel

我正在尝试向 MyViewModel 注入一个模块

这是我的模块

@Module
@InstallIn(ViewModelComponent::class)
object EngineModule {
    @Provides
    fun getEngine(): String = "F35 Engine"
}

这是我的 viewModel

@HiltViewModel
class MyViewModel @Inject constructor(): ViewModel() {
    @Inject lateinit var getEngine: String

    fun getEngineNameFromViewModel(): String = getEngineName()
}

它抛出

kotlin.UninitializedPropertyAccessException: lateinit property getEngine has not been initialized

但是,如果我将 ViewModelComponent::class 更改为 ActivityComponent::class 并像这样注入

@AndroidEntryPoint
class MainActivity : ComponentActivity() {

    @Inject
    lateinit var getEngine: String

完美运行

知道如何注入 viewModel 吗?

由于所需的依赖项将被注入到ViewModel的构造函数中,您只需按以下方式修改代码即可使其工作:

@HiltViewModel 
class MyViewModel @Inject constructor(private val engineName: String): ViewModel() {

    fun getEngineNameFromViewModel(): String = engineName

}

您也可以删除 @Inject constructor,因为您已经使用匕首模块提供了依赖项:

@HiltViewModel 
class MyViewModel (private val engineName: String): ViewModel() {

    fun getEngineNameFromViewModel(): String = engineName

}

因此,基本上您可以使用匕首模块或构造函数注入来提供依赖项。