首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >添加AndroidInjector时Dagger缺少绑定

添加AndroidInjector时Dagger缺少绑定
EN

Stack Overflow用户
提问于 2019-07-01 17:48:55
回答 1查看 1.2K关注 0票数 2

我有以下问题:我开始学习Dagger 2,并试图将注入添加到我的App类中。下面是我的App类的代码:

代码语言:javascript
复制
class TraktTvApp : Application(), HasActivityInjector {

    @Inject
    lateinit var androidInjector: AndroidInjector<Activity>

    override fun activityInjector(): AndroidInjector<Activity>? = androidInjector

    override fun onCreate() {
        super.onCreate()

        appContext = applicationContext
        instance = this

        initStetho()
        initFabric()

        DaggerAppComponent
                .builder()
                .application(this)
                .build()
                .inject(this)

        FirebaseInstanceId.getInstance().instanceId
                .addOnCompleteListener(OnCompleteListener { task ->

                    if (!task.isSuccessful) {
                        return@OnCompleteListener
                    }

                    val token = task.result?.token
                }
                )
    }

    private fun initFabric() {
        Fabric.with(this, Crashlytics(), CrashlyticsNdk())
    }

    private fun initStetho() {
        if (BuildConfig.DEBUG) {
            Stetho.initializeWithDefaults(this)
        }
    }

    companion object {
        lateinit var instance: TraktTvApp
        lateinit var appContext: Context
    }

}

在这个类中,我将appContext作为属性,并尝试将其替换为injection。为此,我添加了以下几行

DaggerAppComponent .builder() .application(this) .build() .inject(this)

当我构建我的应用时,一切都很好,但是当我添加

代码语言:javascript
复制
    @Inject
    lateinit var androidInjector: AndroidInjector<Activity>

    override fun activityInjector(): AndroidInjector<Activity>? = androidInjector

在尝试构建时,我得到了这个错误:

代码语言:javascript
复制
public abstract interface AppComponent {
                ^
      dagger.android.AndroidInjector<android.app.Activity> is injected at
          com.mikhailovskii.trakttv.TraktTvApp.androidInjector
      com.mikhailovskii.trakttv.TraktTvApp is injected at
          com.mikhailovskii.trakttv.di.AppComponent.inject(com.mikhailovskii.trakttv.TraktTvApp)

我已经看到了可能的解决方案,但没有一个对我有帮助。这是我的AppModule的代码

代码语言:javascript
复制
@Module
class AppModule {

    @Singleton
    @Provides
    fun provideContext(application: TraktTvApp): Context {
        return application.applicationContext
    }

}

这是AppComponent

代码语言:javascript
复制
@Singleton
@Component(
        modules = [
            AndroidSupportInjectionModule::class,
            AppModule::class
        ]
)
interface AppComponent {

    @Component.Builder
    interface Builder {

        @BindsInstance

        fun application(application: TraktTvApp): Builder

        fun build():AppComponent

    }

    fun inject(application: TraktTvApp)

}

那么,问题是什么,我该如何解决它呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-01 18:59:18

您不需要手动添加AndroidInjector。您可以使用Dagger基类,这样Dagger将为您处理它

您应该从DaggerApplication扩展Application

代码语言:javascript
复制
 class MyApp: DaggerApplication() {

    /**
     * Returns the injector
     */
    override fun applicationInjector(): AndroidInjector<out DaggerApplication> {

        val appComponent = DaggerAppComponent.builder().application(this).build()
        appComponent.inject(this)

        return appComponent

    }

您的Main Component还扩展了AndroidInjector

代码语言:javascript
复制
/**
 * The main component that holds and services all modules within its builder.
 */
@Singleton
@Component(modules = [AndroidSupportInjectionModule::class])
interface AppComponent : AndroidInjector<MyApp> {

    /**
     * A {@see [Component.Builder]} that initializes necessary implementations
     */
    @Component.Builder
    interface Builder {

        @BindsInstance
        fun application(application : Application) : Builder
        fun build() : AppComponent
    }

}

如果您想使用上下文,可以将其添加到您的AppModule中

代码语言:javascript
复制
@Module
class AppModule {

    @Singleton
    @Provides
    fun provideContext(application: Application): Context {
        return application.applicationContext
    }

}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56833453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档