gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 08:17:53 24 4
gpt4 key购买 nike

我有以下问题:我开始研究 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/

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