Hilt Android 能否在不同的活动中允许视图模型的不同实例?

Can Hilt Android allow different instances of a viewmodel in different activites?

当使用 Hilt 在两个不同的活动中使用相同的视图模型 class 时,视图模型的参数会抛出错误“存在匹配键的绑定”。

@HiltViewModel 
class ViewmodelA @Inject constructor(val paramA :TypeA)
{ //some other code }

以上是视图模型的片段 class。

此视图模型正在其他两个活动中重复使用。

在第二个 activity 的 paramA 编译期间抛出错误,提示“存在与匹配键的绑定”。

这在 dagger2 中使用视图模型工厂是可能的。不过 Hilt 似乎对此并不满意。

使用的 Hilt 版本:2.37

有人可以帮忙吗? / 对此有任何解决方法吗?

确切的错误是这样的:


error: [Dagger/MissingBinding] (package_name).TypeA cannot be provided without an @Inject constructor or an @Provides-annotated method.
  public abstract static class SingletonC implements (AppName)_GeneratedInjector,
A binding with matching key exists in component: (package_name)_HiltComponents.ViewModelC
      (package_name).TypeA is injected at
          (package_name). ViewmodelA(…, paramA, …)
      (package_name).ViewmodelA is injected at
          (package_name of another_Activity).viewModel
      (package_name of another_activity) is injected at……………..

您正在尝试将 ViewmodelA 直接注入第二个 activity。这是 @HiltViewModel classes 的错误,因为 Android Jetpack ViewModels 应该通过 ViewModelProvider.

访问
// don't do this
@Inject
lateinit var viewModel: ViewmodelA

// do this instead
val viewModel: ViewmodelA by viewModels()

您通常会收到一条错误消息,告诉您不要直接注入 HiltViewModel class。但是,在这种情况下,TypeA 仅在 ViewModelComponent 中提供,而您正试图在 ActivityComponent 中创建 ViewmodelA 的实例。在 ActivityComponent 中无法满足您的视图模型的依赖关系,因此 Dagger 首先会抛出一个错误。