android - 添加 AndroidInjector 时 Dagger 缺少绑定(bind)

标签 android kotlin dependency-injection dagger-2

我有以下问题:我开始研究 Dagger 2 并尝试向我的 App 类添加注入(inject)。这是我的 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 作为属性,我试图用注入(inject)替换它。为此,我添加了这一行

DaggerAppComponent .builder() .application(这个) 。 build () .注入(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。您可以使用 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
    }

}

关于android - 添加 AndroidInjector 时 Dagger 缺少绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56833453/

相关文章:

c# - 如何在 ASP.net Core 2 中使用 Windsor IoC

ios - 推荐的 iOS IoC 框架?

android - 保护应用内购买免受 Freedom Hack

android - 使用 Sinch Video Calling 传递额外数据

java - 在启动时加载单选按钮选择

android - 尝试在 Android Studio 中升级到 Kotlin 1.4.10 时出现异常

generics - Kotlin 中的 reified 关键字是如何工作的?

android - android 上的 libsodium 集成

java - 无法使用 Gradle 和 Kotlin 运行生成的 JAR 文件

rust - 抽象引用容器(Rc、Arc、Box、...)