android - View 模型中不允许字段注入(inject)吗?

标签 android dependency-injection dagger-hilt

我是 Android 中依赖注入(inject)的新手,我正在尝试使用 Hilt 将它应用到我的应用中。我有一个用 @HiltViewModel 注释的 View 模型,我正在尝试使用 @Inject 注释现场注入(inject)存储库。但我不断收到此错误:

public final class AlarmsViewModel extends androidx.lifecycle.ViewModel {
             ^
  @HiltViewModel annotated class should contain exactly one @Inject annotated constructor.
  [Hilt] Processing did not complete. See error above for details.

这是我的 View 模型:

@HiltViewModel
class AlarmsViewModel : ViewModel() {
    var alarmsLiveData = MutableLiveData<MutableList<Alarm>>()
    var alarmFormLiveData = MutableLiveData<Alarm>()
    @Inject lateinit var alarmsRepository: AlarmsRepository

    init {
        alarmFormLiveData.value = Alarm()
    }

    fun save() {
        viewModelScope.launch {
            alarmsRepository.save(alarmFormLiveData.value!!)
        }
    }
}

这是我要注入(inject)的仓库:

class AlarmsRepository @Inject constructor(
    private val alarmDao: AlarmDao
) {
    suspend fun load(): Flow<List<Alarm>> {
        return alarmDao.load()
    }

    suspend fun save(alarm: Alarm) {
        alarmDao.save(alarm)
    }
}

你认为我做错了什么?也许我误解了什么。 另外我使用的刀柄版本是2.37

最佳答案

我从 Dagger 文档(https://dagger.dev/api/latest/dagger/hilt/android/lifecycle/HiltViewModel.html)中发现@HiltViewModel 只接受构造函数注入(inject)。我认为android文档没有澄清它。所以解决这个问题的唯一方法是构造函数注入(inject),就像@Pratyush 发布的答案一样,

关于android - View 模型中不允许字段注入(inject)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68615371/

相关文章:

php - 使用 JavaScript 进行依赖注入(inject) |有用还是没用?

android - 如何在 Roboguice 中使用上下文单例

java - 如何用spring高效的实现一个策略模式?

android - 使用 Hilt 注入(inject) CoroutineWorker

android - Dagger Hilt 错误注入(inject) ActivityContext

Android:在警告对话框中格式化字体

Android Wear Proguard

java.lang.UnsatisfiedLinkError : for the second method 错误

android - 对可绘制的 alpha 属性进行动画处理

android - dagger.hilt.android.internal.managers.ViewComponentManager$FragmentContextWrapper 无法转换为 android.app.Activity