注入通用的ViewModel Dagger Hilt Android

时间:2020-08-29 13:21:34

标签: java android kotlin dagger-2 dagger-hilt

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

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

@Inject
lateinit var viewModel: VM

}

1 个答案:

答案 0 :(得分:1)

更新1

这是我在谈论的来自希尔特团队的回复:

因此@ViewModelInject是一种单向事物,在某种程度上类似于@AndroidEntryPoint。它只会将Dagger依赖项添加到您的类中。它不会将您的ViewModel作为Dagger绑定添加到对象图。为了在提供者或其他地方访问ViewModel,您仍需要像获取ViewModelProvider一样使用获取视图模型的常规Android API。

之所以无法在图表中提供它,是因为我们不知道要与哪个ViewModelStoreOwner一起使用。

您可以找到此评论here


原始答案

几天前我试图这样做,我想我在互联网上的某个地方读到了它,希特(Hilt)无法做到这一点(直到现在我都找不到链接)。

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

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

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

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

@AndroidEntryPoint
abstract class BaseActivity: AppCompatActivity() {

    private val viewModel: MyViewModel by viewModels()

}

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