java - Kotlin、Dagger2、MVVM 和 ContributesAndroidInjector
问题描述
我们遇到了 Dagger2 的问题,其中指定 using 的模块ContributesAndroidInjector
在编译时无法识别。
// This doesn't work
@Module
abstract class ActivityBuildersModule {
@ContributesAndroidInjector(
modules = [
FragmentBuildersModule::class,
FeatureViewModelModule::class,
]
)
abstract fun contributeMainActivity(): MainActivity
}
这是我们的模块,它会导致以下错误:
javax.inject.Provider<androidx.lifecycle.ViewModel>> cannot be provided without an @Provides-annotated method.
如果我们将声明提升到类级别,一切都会按预期运行:
// This works
@Module(includes = [
FeatureViewModelModule::class,
])
abstract class ActivityBuildersModule {
@ContributesAndroidInjector(
modules = [
FragmentBuildersModule::class,
]
)
abstract fun contributeMainActivity(): MainActivity
}
请注意,此问题并非 FeatureViewModelModule 独有。如果放在@ContributesAndroidInjector 中,任何提供某种依赖的模块都将无法工作。
有趣的是,GitHub 上有一个项目似乎在做同样的事情而没有任何问题。我能看到的项目之间的唯一区别是我们的项目使用 Kotlin,而他们的项目使用 Java。
一些进一步的信息:
class MyApplication : DaggerApplication(){
override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
return DaggerAppComponent.builder().application(this).build()
}
}
@Singleton
@Component(
modules = [
AndroidInjectionModule::class,
ActivityBuildersModule::class,
AppModule::class]
)
interface AppComponent : AndroidInjector<MyApplication> {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
}
@Singleton
class ViewModelFactory @Inject constructor(
private val creators: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
val creator = creators[modelClass] ?: creators.entries.firstOrNull {
modelClass.isAssignableFrom(it.key)
}?.value ?: throw IllegalArgumentException("unknown model class $modelClass")
try {
@Suppress("UNCHECKED_CAST")
return creator.get() as T
} catch (e: Exception) {
throw RuntimeException(e)
}
}
}
@Suppress("unused")
@Module
abstract class FeatureViewModelModule {
@Binds
@IntoMap
@ViewModelKey(FeatureViewModel::class)
abstract fun bindCompanyViewModel(featureViewModel: FeatureViewModel): ViewModel
}
有谁知道会发生什么?
解决方案
请@contributionAndroidInject
删除摘要
@Module
interface ActivityBuilderModule {@ContributesAndroidInjector fun contributeAuthActivity(): MainActivity}
推荐阅读
- haskell-stack - 如何显示`stack haddock`的进度?
- jquery - 当使用 Laravel 取消选择另一个框时,取消选择“全选”复选框。
- php - PHP MariaDB PDO 计算重复值
- javascript - 当元素被另一个元素替换时计数动画
- excel - 汇总成 Mastersheet 后自动排序
- pentaho - 如何在pentaho中将参数“from”添加到sql查询中?
- python - Selenium Python - 从 try-except 循环写入 CSV
- hyperledger - 如何从 Hyperledger Sawtooth 获取交易 ID
- postgresql - 内核 - libc-2.19.so 中的 postgres 段错误 15
- sql - 如果列值为NULL,如何在连接中选择一列而不是另一列?