【问题标题】:Inject generic ViewModel Dagger Hilt Android注入通用 ViewModel Dagger Hilt Android
【发布时间】:2020-09-05 14:36:03
【问题描述】:

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

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

@Inject
lateinit var viewModel: VM

}

【问题讨论】:

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


    【解决方案1】:

    更新 1

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

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

    我们无法将其提供到图表中的原因是我们不知道您想将它与哪个 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 团队提到这一点的评论,我将在此处更新答案。

    【讨论】:

    • 感谢 @Ahmed 更新我的信息,一旦你找到了答案,请更新你的答案
    • @SahilShokeen 我刚刚用我正在谈论的评论更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 2021-06-30
    相关资源
    最近更新 更多