如果没有提供注释的方法,则无法提供Android匕首

Dav*_*vid 1 android kotlin dagger-2

我决定学习dagger依赖注入框架。经过一些教程之后,我尝试将匕首实现到我的项目中。但是我得到了这个错误

com\assigment\di\component\AppComponent.java:11: error: [Dagger/MissingBinding] java.util.Map<java.lang.Class<? extends android.app.Activity>,javax.inject.Provider<dagger.android.AndroidInjector.Factory<? extends android.app.Activity>>> cannot be provided without an @Provides-annotated method.
    public abstract void inject(@org.jetbrains.annotations.NotNull()
                         ^
      java.util.Map<java.lang.Class<? extends android.app.Activity>,javax.inject.Provider<dagger.android.AndroidInjector.Factory<? extends android.app.Activity>>> is injected at
          dagger.android.DispatchingAndroidInjector.<init>(injectorFactories)
      dagger.android.DispatchingAndroidInjector<android.app.Activity> is injected at
          assigment.com.assigment.App.activityInjector
      assigment.com.assigment.App is injected at
          assigment.com.assigment.di.component.AppComponent.inject(assigment.com.assigment.App)
Run Code Online (Sandbox Code Playgroud)

我尝试解决2天,但没有运气。所以这是我设置项目的方式

class App : Application(), HasActivityInjector  {
    @Inject
    lateinit var activityInjector: DispatchingAndroidInjector<Activity>

    lateinit var appComponent: AppComponent

    override fun onCreate() {
        super.onCreate()

        appComponent = DaggerAppComponent
                .builder()
                .appModule(AppModule())
                .build()
    }

    override fun activityInjector(): AndroidInjector<Activity> {
        return activityInjector
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的应用程序组件

@Singleton
@Component(modules = [AppModule::class])

interface AppComponent : AndroidInjector<App> {

    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: Application): Builder
        fun build(): AppComponent
    }
    override fun inject(app: App)
}
Run Code Online (Sandbox Code Playgroud)

这是我的appModule类

应用模块

@Module
class AppModule {
    private val url = "http://test.lt/v1/"

    @Provides
    @Singleton
    fun provideApplication(app: Application): Context = app
}
Run Code Online (Sandbox Code Playgroud)

那我在实现中缺少什么呢?

eur*_*com 6

将AndroidInjectionModule.class和ActivityBuilder.class添加到您的AppComponent

@Singleton
@Component(modules = [AndroidInjectionModule::class, AppModule::class, ActivityBuilder::class ])

interface AppComponent : AndroidInjector<App> {

  @Component.Builder
  interface Builder {
    @BindsInstance
    fun application(application: Application): Builder
    fun build(): AppComponent
  }
 override fun inject(app: App)
}
Run Code Online (Sandbox Code Playgroud)


att*_*ona 6

你有两个问题。

要摆脱编译器错误添加AndroidInjectionModule::class到组件模块:

@Singleton
@Component(modules = [AndroidInjectionModule::class, AppModule::class])
interface AppComponent : AndroidInjector<App> {


    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: Application): Builder
        fun build(): AppComponent
    }

    override fun inject(app: App)
}
Run Code Online (Sandbox Code Playgroud)

使用带@Component.Builder注释的接口,您可以使用带注释的@BindsInstance方法定义构建器接口application()(注意,appModule在 Builder 中没有声明方法)。

有了这样的声明,您可以使用application(this)以下方法构建您的组件:

    appComponent = DaggerAppComponent
            .builder()
            .application(this)
            .build()
Run Code Online (Sandbox Code Playgroud)

通过这种方式,this应用程序实例被绑定在组件内部。

顺便说一句:绑定实例记录在此处,但我个人发现对于像我这样学习 Dagger 的人来说,这个解释很难理解。