【发布时间】:2021-06-24 14:27:22
【问题描述】:
我在我的 Android 项目中使用 Dagger-Hilt 进行依赖注入,现在我遇到了这种情况,我有一个基本的抽象片段
BaseViewModel.kt
abstract class BaseViewModel constructor(
val api: FakeApi,
) : ViewModel() {
//...
}
在这里,我有一个依赖项 FakeApi。我要做的是将FakeApi 注入BaseViewModel,以便在BaseViewModel 及其所有子代中可用。
- 我尝试的第一种方法是使用构造函数注入并将其注入子级,然后使用构造函数将其传递给超级。
TaskViewModel.kt
@HiltViewModel
class TaskViewModel @Inject constructor(
api: FakeApi
) : BaseViewModel(api){
}
这种方法效果很好,但是我不需要将依赖关系从child 传递给super 类,我需要将FakeApi 自动注入BaseViewModel 而不必传递它因为我有三个抽象级别(还有一个继承自TaskViewModel的类)所以我必须通过它两次。
- 第二种方法是使用现场注入,如下所示
BaseViewModel.kt
abstract class BaseViewModel: ViewModel() {
@Inject
lateinit var api: FakeApi
//...
}
TaskViewModel.kt
@HiltViewModel
class TaskViewModel @Inject constructor(): BaseViewModel() {
}
这种方法对我不起作用,FakeApi 没有被注入,我有一个 Exception
kotlin.UninitializedPropertyAccessException: lateinit property api has not been initialized
我的问题是
- 为什么现场注入对我不起作用?
- 有什么方法可以对
super类使用构造函数注入,而不是从child传递依赖关系?
【问题讨论】:
-
您的错误中提到了
communicationHandler,但您的问题中没有提及? -
TaskViewModel在您的第二种方法中看起来像什么? -
@HenryTwist 这是另一个没有提到的依赖项。我编辑了问题。
-
你能改变你的文字和标题吗?你说你有一个基本片段,但它说“baseviewmodel”。这很烦人
标签: android dependency-injection dagger-hilt