gpt4 book ai didi

java - Kotlin、Dagger2、MVVM 和 ContributesAndroidInjector

转载 作者:太空狗 更新时间:2023-10-29 13:44:45 26 4
gpt4 key购买 nike

我们在使用 ContributesAndroidInjector 指定的模块时遇到 Dagger2 问题在编译时未被识别。

// 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 中,任何提供某种依赖关系的模块都将无法工作。

有趣的是,是否有一个 project在 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}

关于java - Kotlin、Dagger2、MVVM 和 ContributesAndroidInjector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56403184/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com