【问题标题】:Unable to Inject ViewModel from a different module in Android project无法从 Android 项目中的不同模块注入 ViewModel
【发布时间】:2021-02-04 19:19:01
【问题描述】:

我不确定这是否是 Dagger Hilt 库的限制,但我似乎无法从活动中的不同模块注入 ViewModel。

Project:
  :modA (OrderViewModel with @HiltViewModel annotation)
  :modUI (DI stuff here that injects OrderViewModel in Activity) with dependency on modA
  :modOther
@HiltViewModel
class OrderViewModel @Inject constructor(
    private val loadOrdersUseCase: LoadOrdersUseCase,
    private val updateOrderUseCase: UpdateOrderUseCase,
    private val mapper: OrderDataMapper,
) : SharedViewModel<OrderDataModel>() 

像这样注入的:


private val orderViewModel: OrderViewModel by viewModels()

我看不到分别生成的 OrderViewModel_HiltModulesOrderViewModel_HiltModules 类。事实上,当我运行应用程序时,它会崩溃并出现下面的崩溃,这表明他们的 ViewModel 不在 hilt 应该创建的 ViewModel 键盘映射中。

Caused by: java.lang.RuntimeException: Cannot create an instance of class com.rowland.delivery.presentation.viewmodels.order.OrderViewModel
.
.
.
Caused by: java.lang.InstantiationException: java.lang.Class<com.rowland.delivery.presentation.viewmodels.order.OrderViewModel> has no zero argument constructor
        at java.lang.Class.newInstance(Native Method)
        at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:219)

这是匕首的限制吗?任何见解将不胜感激。

有时间复现的可以看一下下面的代码分支:

【问题讨论】:

    标签: android dagger-2 android-viewmodel dagger-hilt


    【解决方案1】:

    看来编译器是解决这个多模块问题的关键。使用任何 Dagger Hilts 属性注释的任何模块也需要定义 dagger hilt 依赖项和编译器,即:

        implementation 'com.google.dagger:hilt-android:2.31.2-alpha'
        kapt 'com.google.dagger:hilt-android-compiler:2.31.2-alpha'
        implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03"
        kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha03'
    

    否则,将不会生成相应的绑定/提供程序。在这种情况下,根本没有生成 ViewModel 提供程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多