【问题标题】:Kotlin Dagger ViewModel cannot be provided without an @Provides-annotated method [duplicate]没有 @Provides 注释的方法无法提供 Kotlin Dagger ViewModel [重复]
【发布时间】:2018-03-19 10:55:23
【问题描述】:

我正在尝试将 Dagger 2.15 与我的 Kotlin 项目集成。即使我绑定了 ViewModel,我也会收到以下编译时异常,

error: [dagger.android.AndroidInjector.inject(T)] java.util.Map<java.lang.Class<? extends android.arch.lifecycle.ViewModel>,? extends javax.inject.Provider<android.arch.lifecycle.ViewModel>> cannot be provided without an @Provides-annotated method.

我的代码: https://github.com/rramprasad/FoodRecipes

【问题讨论】:

  • 它在 Kotlin Dagger 处理器中的问题你应该将你的 ViewModelFactory 和 ViewModelKey 转换为 Java,因为它对我有用

标签: android kotlin dagger-2 dagger


【解决方案1】:

我浏览了你的代码,我相信问题出在这段代码的某个地方:

@Binds
@IntoMap
@ViewModelKey(MainViewModel::class)
abstract fun bindMainViewModel(userViewModel: MainViewModel): MainViewModel

为了绑定MainViewModel,首先你需要在MainViewModel中进行构造函数注入,如下:

class MainViewModel
@Inject constructor()
: AndroidViewModel(Application())

此外,您绑定或使用 @Binds 与 MainViewModel 的方式不正确,您无法返回作为参数传入的内容,dagger 将在构建时抛出 Cyclic Dependency 异常。有关绑定的更多信息,请参阅此article,为避免此错误,请将绑定代码更改为:

 @Binds
 @IntoMap
 @ViewModelKey(MainViewModel::class)
 abstract fun bindMainViewModel(userViewModel: MainViewModel): ViewModel

尝试这些更改,如果您遇到任何问题,请告诉我。谢谢

【讨论】:

  • 通过在 ViewModelFactory 类的构造函数第二个参数中添加 JvmSuppressWildcards 解决了这个问题。它工作正常。但提供方法仅适用于 AppModule。如果我使用 ContributesAndroidInjector 添加另一个子模块,它不起作用。显示错误消息错误:[dagger.android.AndroidInjector.inject(T)] android.arch.lifecycle.MutableLiveData 不能在没有 Inject 的情况下提供构造函数或来自提供注解的方法。
  • @Ramprasad 如果您可以分享您添加另一个子模块的代码链接以及正在创建问题的 ContributesAndroidInjector,那么这将有助于了解您的问题。
  • 它在 Kotlin Dagger 处理器中的问题你应该将你的 ViewModelFactory 和 ViewModelKey 转换为 Java,因为它对我有用
  • 这个人在kotlin中实现了,为什么要在Java中转换呢?此外,问题不在处理器中,而是在 @Binds 注释的错误实现中,请参阅此 link 了解更多详细信息。
猜你喜欢
  • 2020-05-16
  • 1970-01-01
  • 1970-01-01
  • 2019-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-04
  • 2016-07-12
相关资源
最近更新 更多