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