【问题标题】:Dagger missing binding while adding AndroidInjector添加 AndroidInjector 时 Dagger 缺少绑定
【发布时间】:2019-11-11 23:30:18
【问题描述】:

我有以下问题:我开始研究 Dagger 2 并尝试将注入添加到我的 App 类。这是我的 App 类的代码:

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 作为属性,我试图用注入替换它。为此,我添加了这一行

DaggerApp 组件 .builder() .application(这个) 。建造() .inject(这个)

当我构建我的应用程序时一切正常,但是当我添加时

    @Inject
    lateinit var androidInjector: AndroidInjector<Activity>

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

并尝试构建我得到了这个错误:

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的代码:

@Module
class AppModule {

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

}

这里是AppComponent

@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)

}

那么,问题出在哪里,我该如何解决?

【问题讨论】:

  • 你为什么要在你的应用程序中添加AndroidInjector

标签: android kotlin dependency-injection dagger-2


【解决方案1】:

您无需手动添加AndroidInjector。您可以使用 Dagger 基类,以便 Dagger 为您处理它

你应该从DaggerApplication扩展你的Application

 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

/**
 * 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
    }

}

如果你想使用 Context,你可以将它添加到你的 AppModule 中

@Module
class AppModule {

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

}

【讨论】:

  • 是的,非常感谢,但您能解释一下我现在应该通过什么方式获取上下文吗?之前我以以下方式进行:TraktTvApp.appContext 现在我应该以什么方式进行?我试过这个:AppModule().provideContext(TraktTvApp()),但我认为这不是正确的方法
  • 或者我应该在 App 类中更改它,例如 appContext = AppModule().provideContext(this)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 2018-07-09
  • 2016-01-16
  • 2023-03-26
  • 2018-10-01
  • 1970-01-01
相关资源
最近更新 更多