Кинжал Android не может быть предоставлен без аннотированного метода Provides - PullRequest
0 голосов
/ 26 июня 2018

Я решил изучить 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)

Я пытаюсь решить эту проблему в течение 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
    }
}

Вот мой компонент приложения

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

и вот мой класс appModule

AppModule

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

    @Provides
    @Singleton
    fun provideApplication(app: Application): Context = app
}

Так чего мне не хватает в этой реализации?

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

У вас две проблемы.

Чтобы избавиться от ошибки компилятора, добавьте 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)
}

Используя аннотированный интерфейс @Component.Builder, вы определяете интерфейс построителя с помощью аннотированного метода @BindsInstance application() (обратите внимание, что в построителе не объявлен метод appModule).

С таким объявлением вы можете создать свой компонент, используя application(this):

    appComponent = DaggerAppComponent
            .builder()
            .application(this)
            .build()

Таким образом this экземпляр приложения привязывается внутри компонента.

Так же, как примечание: Обязательные инстанции задокументированы здесь , но лично я нашел объяснение довольно сложным для понимания кем-то, кто изучает кинжал, как я.

0 голосов
/ 26 июня 2018

Добавьте 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)
}
...