嗨,我想在我的BaseActivity中注入通用的ViewModel类型,如何使用Dagger Hilt解决。
@AndroidEntryPoint
abstract class BaseActivity<VM: BaseViewModel> : AppCompatActivity() {
@Inject
lateinit var viewModel: VM
}
答案 0 :(得分: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团队提到此问题的评论,我将在此处更新答案。