1

嗨,我想在我的 BaseActivity 中注入通用 ViewModel 类型,如何使用 Dagger Hilt 解决这个问题。

@AndroidEntryPoint
 abstract class BaseActivity<VM: BaseViewModel> : AppCompatActivity() {

@Inject
lateinit var viewModel: VM

}
4

1 回答 1

2

更新 1

这是我所说的 Hilt 团队的回复:

所以@ViewModelInject 是一种单向的东西,在某种程度上类似于@AndroidEntryPoint。它只会将 Dagger 依赖项添加到您的类中。它不会将您的 ViewModel 作为 Dagger 绑定添加到对象图中。为了在提供者或其他地方访问您的 ViewModel,您仍然需要通过普通的 Android API 来获取视图模型,例如使用 ViewModelProvider。

我们无法将其提供到图中的原因是我们不知道您想将它与哪个 ViewModelStoreOwner 一起使用。

您可以在此处找到此评论。


原始答案

几天前我试图这样做,我想我在互联网上的某个地方读到它不可能让 Hilt 这样做(直到现在我找不到链接)。

通常在 Java 中,我们像这样创建 ViewModel:

MyViewModel model = new ViewModelProvider(this).get(MyViewModel.class);

我们需要在构造函数中提供ViewModelStoreOwnerViewModelProvider,我了解到 hilt 无法知道ViewModelStoreOwner您要为哪个MyViewModel创建。

所以我们将继续以旧的方式创建视图模型,在 Kotlin 中你将坚持这样做:

@AndroidEntryPoint
abstract class BaseActivity: AppCompatActivity() {

    private val viewModel: MyViewModel by viewModels()

}

一旦我发现 Hilt 团队提到这一点的评论,我将在此处更新答案。

于 2020-09-03T11:57:04.327 回答