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