视图模型中不允许字段注入吗?

时间:2021-08-02 00:39:58

标签: android dependency-injection dagger-hilt

我是 Android 中依赖注入的新手,我正在尝试使用 Hilt 在我的应用程序中应用它。我有一个用 @HiltViewModel 注释的视图模型,我正在尝试使用 @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.

这是我的视图模型:

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

这是我要注入的存储库:

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

错误提示“@HiltViewModel 注释类应该只包含一个@Inject 注释构造函数。”

您的 AlarmsViewModel 缺少一个

替换:

@HiltViewModel
class AlarmsViewModel : ViewModel()

与:

@HiltViewModel
class AlarmsViewModel @Inject constructor(var alarmsRepository: AlarmsRepository) : ViewModel()

并删除

@Inject lateinit var alarmsRepository: AlarmsRepository