Dagger-Androd @ActivityKey не найден, как явно создавать субкомпоненты - PullRequest
0 голосов
/ 01 марта 2020

В кинжале 2.25.2 не удается найти import dagger.android.ActivityKey, поэтому я не могу добавить субкомпонент явно, вместо использования @ContributesInjector, используя ApplicationModule

@Module(subcomponents = [MainActivitySubComponent::class], includes = [DummyDependencyModule::class])
abstract class AppModule {

    @Binds
    abstract fun bindContext(application: Application): Context

    @Binds
    @IntoMap
    @ActivityKey(MainActivity::class)
    abstract fun bindInjectorFactory(builder: MainActivitySubComponent.Builder)
            : AndroidInjector.Factory<out Activity>

    @Module
    companion object DummyDependencyModule {
        @Provides
        fun provideDummyDependency(context: Context): DummyDependency {
            return DummyDependency(context)
        }
    }

}

Компонент приложения равен

@Component(modules = [AndroidSupportInjectionModule::class, AppModule::class])
interface AppComponent : AndroidInjector<DaggerApplication> {

    @Component.Builder
    interface Builder {

        @BindsInstance
        fun application(application: Application): Builder

        fun build(): AppComponent
    }
}

Подкомпонент MainActivity имеет значение

@Subcomponent
interface MainActivitySubComponent : AndroidInjector<MainActivity> {
    @Subcomponent.Builder
    abstract class Builder : AndroidInjector.Builder<MainActivity>()
}

I создан и ActivityKey , поскольку он не может найти тот из библиотеки Dagger

с ошибкой

ошибка: не удается найти символ, @ActivityKey (MainActivity.class) ^ символ: класс ActivityKey расположение: класс ApplicationModule

@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.PROPERTY_GETTER)
@Retention(AnnotationRetention.RUNTIME)
@MapKey
internal annotation class ActivityKey(val value: KClass<out Activity>)

И ошибка

IllegalArgumentException: No injector factory bound for Class<cMainActivity>

1 Ответ

0 голосов
/ 04 марта 2020

После проверки сгенерированного кода я обнаружил, что теперь он используется как @ClassKey в AppModule

@ClassKey(MainActivity::class)
abstract fun bindInjectorFactory(builder: MainActivitySubComponent.Builder)
        : AndroidInjector.Factory<*>

вместо

  @Binds
    @IntoMap
    @ActivityKey(MainActivity::class)
    abstract fun bindInjectorFactory(builder: MainActivitySubComponent.Builder)
            : AndroidInjector.Factory<out Activity>

, а код ClassKey -

@Documented
@Target(METHOD)
@Retention(RUNTIME)
@MapKey
public @interface ClassKey {
  Class<?> value();
}
...