【发布时间】:2018-05-13 22:23:31
【问题描述】:
我正在使用 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,这样我就可以避免注入 fragmentInjector: DispatchingAndroidInjector<Fragment>。它现在正在工作,因为我在 SplashScreenActivity 中没有任何片段。
【问题讨论】:
-
这是完整的错误吗?
java.util.Map,javax.inject.Provider>>看起来像是被切断了。你能用AndroidSupportInjectionModule代替AndroidInjectionModule吗? -
是的,你是对的。使用 Blockqoute,一些短语被删除。现在解决了。感谢您指出。
-
是的,你好像少了
AndroidSupportInjectionModule,你可以试试上面提到的切换吗? -
@DavidMedenjak 我会被诅咒的。
AndroidSupportInjectionModule已修复。我自己永远不会发现这一点。非常感谢。
标签: android dependency-injection dagger-2 dagger