视图模型中不允许字段注入吗?
Is field injection not allowed in viewmodels?
我是 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
如错误所说“带注释的@HiltViewModel class 应该恰好包含一个带注释的@Inject 构造函数。”
你的 AlarmsViewModel 少了一个
替换:
@HiltViewModel
class AlarmsViewModel : ViewModel()
与 :
@HiltViewModel
class AlarmsViewModel @Inject constructor(var alarmsRepository: AlarmsRepository) : ViewModel()
并删除
@Inject lateinit var alarmsRepository: AlarmsRepository
我从 dagger 文档 (https://dagger.dev/api/latest/dagger/hilt/android/lifecycle/HiltViewModel.html) 中发现 @HiltViewModel 只接受构造函数注入。我认为 android 文档没有阐明它。所以这个问题的唯一解决方法是构造函数注入,就像@Pratyush 发布的答案一样,
我是 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
如错误所说“带注释的@HiltViewModel class 应该恰好包含一个带注释的@Inject 构造函数。”
你的 AlarmsViewModel 少了一个
替换:
@HiltViewModel
class AlarmsViewModel : ViewModel()
与 :
@HiltViewModel
class AlarmsViewModel @Inject constructor(var alarmsRepository: AlarmsRepository) : ViewModel()
并删除
@Inject lateinit var alarmsRepository: AlarmsRepository
我从 dagger 文档 (https://dagger.dev/api/latest/dagger/hilt/android/lifecycle/HiltViewModel.html) 中发现 @HiltViewModel 只接受构造函数注入。我认为 android 文档没有阐明它。所以这个问题的唯一解决方法是构造函数注入,就像@Pratyush 发布的答案一样,