Kotlin Dagger Module не установлен - PullRequest
0 голосов
/ 11 мая 2018

Новичок в kotlin и попытка миграции через небольшой проект Android, написанный на Java.Не знаю, что делать с этой ошибкой:

Причина: java.lang.IllegalStateException:
com.mydomain.example.dagger.BusModule должен быть установлен
> на com.mydomain.example.dagger.DaggerAppComponent $ Builder.build (DaggerAppComponent.java:87)
> в com.mydomain.example.MyApplication.buildComponent (MyApplication.kt: 29)
> в com.mydomain.example.MyApplication.onCreate (MyApplication.kt: 17)
> в android.app.Instrumentation.callApplicationOnCreate (Instrumentation.java:1118)
> в android.app.ActivityThread.handleBindApplication (ActivityThread.java:5791)

Вот класс BusModule:

@Module
object BusModule {

    const val PROVIDER_FRAGMENT_SELECTION = "fragment_selection"

    @Provides
    @Singleton
    @Named(PROVIDER_FRAGMENT_SELECTION)
    fun provideNewFragmentSelection(): PublishSubject<String> {
        return PublishSubject.create()
    }
}

А вот класс AppComponent:

@Component(modules = [(AppModule::class), (DataModule::class), (BusModule::class)])
@Singleton
interface AppComponent {

    @get:Named(BusModule.PROVIDER_FRAGMENT_SELECTION)
    val selectedFragmentName: PublishSubject<String>

    fun inject(mainActivity: MainActivity)
}

И, наконец, класс приложения:

class MyApplication : Application() {

    override fun onCreate() {
        super.onCreate()
        appComponent = buildComponent()
    }

    private fun buildComponent(): AppComponent {
        return DaggerAppComponent.builder().build()
    }

    companion object {

        var appComponent: AppComponent? = null
            private set
    }
}

Не могу понять, что означает сообщение об ошибке.Как BusModule не «установлен»?Спасибо!

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Я думаю, все, что вам нужно было бы сделать, это добавить @JvmStatic аннотацию.

@Module
object BusModule {
    @Provides
    @Singleton
    @Named(PROVIDER_FRAGMENT_SELECTION)
    @JvmStatic
    fun provideNewFragmentSelection(): PublishSubject<String> {
        return PublishSubject.create()
    }
0 голосов
/ 11 мая 2018

BusModule должен быть классом вместо объекта, а const val PROVIDER_FRAGMENT_SELECTION должен быть перемещен в companion object класса.Таким образом, модуль становится:

@Module
class BusModule {
    companion object {
        const val PROVIDER_FRAGMENT_SELECTION = "fragment_selection"
    }
    @Provides
    @Singleton
    @Named(PROVIDER_FRAGMENT_SELECTION)
    fun provideNewFragmentSelection(): PublishSubject<String> {
        return PublishSubject.create()
    }
}
...