gpt4 book ai didi

android - Dagger:组件中存在具有匹配键的绑定(bind)

转载 作者:太空宇宙 更新时间:2023-11-03 12:26:46 25 4
gpt4 key购买 nike

我正在使用 Dagger 2.16 并关注 this我的 Dagger 实现的文章。在我只有一个 Activity(HomeActivity) 之前,此实现一切正常。我一开始在 SplashScreenActivity 中实现 Dagger。我开始收到此错误。这是我项目中的一些代码

AppComponent.kt

@Singleton
@Component(modules = [
AndroidInjectionModule::class,
AppModule::class,
ActivityBuilder::class,
ServiceBuilder::class,
BroadcastRecieverBuilder::class])
interface AppComponent : AndroidInjector<MyApp> {
@Component.Builder
abstract class Builder : AndroidInjector.Builder<MyApp>()
}

AppModule.kt

@Module()
class AppModule {

@Provides
@Singleton
fun provideContext(application: MyApp): Context {
return application
}

@Provides
@Singleton
fun provideRestService(retrofit: Retrofit): RestService {
return retrofit.create(RestService::class.java)
}
...
}

ActivityBuilder.kt

@Module
abstract class ActivityBuilder {

@ContributesAndroidInjector(modules = [HomeActivityModule::class])
@PerActivity
abstract fun bindHomeActivity(): HomeActivity

@ContributesAndroidInjector(modules = [SplashScreenModule::class])
@PerActivity
abstract fun bindSplashActivity(): SplashScreenActivity
}

BaseActivity.kt

abstract class BaseActivity<V : BaseView, P : MvpBasePresenter<V>> :
MvpActivity<V, P>(), BaseView, HasSupportFragmentInjector {
@Inject
lateinit var fragmentInjector: DispatchingAndroidInjector<Fragment>

@Inject
lateinit var mPresenter: P

override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
super.onCreate(savedInstanceState)
}

override fun createPresenter(): P = mPresenter

override fun supportFragmentInjector(): AndroidInjector<Fragment> {
return fragmentInjector
}
}

我有自己的 BaseActivity 而不是 DaggerActivity,因为我要从 mosby 的 MvpActivity 继承。

SplashScreenModule.kt

@Module
abstract class SplashScreenModule {

@Binds
@PerActivity
internal abstract fun splashPresenter(splashPresenter: SplashScreenPresenter): BasePresenter<*>
}

HomeActivityModule.kt

@Module
abstract class HomeActivityModule {

@Binds
@PerActivity
internal abstract fun homePresenter(homePresenter: HomeActivityPresenter): BasePresenter<*>

@ContributesAndroidInjector(modules = [DownloadFragmentModule::class])
@PerFragment
internal abstract fun downloadsFragment(): DownloadsFragment
}

现在当我构建它时,出现如下错误

error: [Dagger/MissingBinding] [dagger.android.AndroidInjector.inject(T)] java.util.Map<java.lang.Class<? extends android.support.v4.app.Fragment>,javax.inject.Provider<dagger.android.AndroidInjector.Factory<? extends android.support.v4.app.Fragment>>> cannot be provided without an @Provides-annotated method.
public abstract interface AppComponent extends dagger.android.AndroidInjector<com.realtime.app.MyApp> {
^
A binding with matching key exists in component: com.realtime.dagger.ActivityBuilder_BindHomeActivity.HomeActivitySubcomponent
java.util.Map<java.lang.Class<? extends android.support.v4.app.Fragment>,javax.inject.Provider<dagger.android.AndroidInjector.Factory<? extends android.support.v4.app.Fragment>>> is injected at
dagger.android.DispatchingAndroidInjector.<init>(injectorFactories)
dagger.android.DispatchingAndroidInjector<android.support.v4.app.Fragment> is injected at
com.realtime.core.BaseActivity.fragmentInjector
com.realtime.splashScreen.SplashScreenActivity is injected at
dagger.android.AndroidInjector.inject(T)
component path: com.realtime.dagger.AppComponent → com.realtime.dagger.ActivityBuilder_BindSplashActivity.SplashScreenActivitySubcomponent

我已经经历过其他类似的问题,例如 this但无法将其与我所面临的联系起来。我错过了什么?

更新:目前我没有在 SplashScreenActivity 中继承 BaseActivity,这样我就可以避免注入(inject) fragmentInjector: DispatchingAndroidInjector<Fragment> .它目前正在工作,因为我在 SplashScreenActivity 中没有任何 fragment 。

最佳答案

它适用于 HomeActivity,因为它绑定(bind)了一个 fragment :

@ContributesAndroidInjector
fun downloadsFragment(): DownloadsFragment

SplashScreenActivity 没有。


AndroidInjection 使用 DispatchingAndroidInjector 来处理运行时注入(inject),它基本上包含类的 Map 到它们的组件构建器。需要像其他所有内容一样注入(inject)此 map 。在 HomeActivity 的情况下,模块中的 fragment 声明为 map 生成一个绑定(bind),然后可以将其注入(inject)。

由于启动 Activity 上没有 fragment ,因此 Dagger 不知道任何绑定(bind),更不用说任何 map 了。这就是为什么它提示它 cannot be provided .

您可以阅读更多here about multibindings .

为防止这种情况发生,您应该注册 AndroidInjectionModule在您的 AppComponent 上,它只包含空 map 的声明。

虽然它包含 android.app.Fragment 的声明,但它不包含 android.support.v4.app.Fragment 的声明,这就是错误的来源。


因此,要修复此特定错误,您应该添加 AndroidSupportInjectionModule到您的组件,其中还包括支持绑定(bind),当 Activity 中没有 fragment 时提供一个空映射。

@Component(modules = [AndroidSupportInjectionModule::class, /* ... */])
interface AppComponent { /* ... */ }

关于android - Dagger:组件中存在具有匹配键的绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50321116/

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