Dagger2 и внешняя библиотека: не удалось запустить действие ComponentInfo - PullRequest
0 голосов
/ 16 января 2020

В моем проекте android я использую модуль библиотеки AAR, который я написал, и для проекта, и для библиотеки Dagger для внедрения зависимостей.

В моем проекте я используйте библиотеку следующим образом:

fun useLibrary() {
    startActivityForResult(
        Intent(
            this,
            LibraryActivity::class.java
        ),
        A_REQUEST_CODE
    )
}

, но когда я запускаю свое приложение, у меня появляется ошибка:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mypackage.android.myproject/com.mypackage.aMyLib.LibraryActivity}: java.lang.IllegalArgumentException: No injector factory bound for Class<com.mypackage.aMyLib.LibraryActivity>

EDIT

Это код кинжала внутри моей библиотеки:

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

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

    override fun inject(application: MyApp)

}

@Module
abstract class ActivityBuilder {

    @ContributesAndroidInjector(
        modules = [
            AppModule::class
        ]
    )
    abstract fun bindLibraryActivity(): LibraryActivity
}

@Module
class AppModule {
    @Provides
    fun provideContext(application: Application) = application as Context

}

Что я пропустил?

1 Ответ

0 голосов
/ 16 января 2020

Вы должны подключить ActivityBuilder модуль к компоненту в модуле приложения, как правило, к root компоненту (предположительно AppComponent в вашем случае). Возможно, вам не нужно иметь какой-либо явно определенный компонент в модуле библиотеки.

@Module
abstract class ActivityBuilder {
    @ContributesAndroidInjector
    abstract fun bindLibraryActivity(): LibraryActivity
}

Root компонент:

@Singleton
@Component(modules = [
    AndroidSupportInjectionModule::class,
    ActivityBuilder::class,
    ....
    ]
)
interface AppComponent { ... }

AppComponent не должен реализовывать интерфейс AndroidInjector. Вы должны расширить android.app.Application и сделать свой собственный класс приложения для реализации интерфейса HasAndroidInjector, чтобы инжекция работала.

Прочтите эту страницу для лучшего понимания и использования.

...