Объект не может быть предоставлен без @Provides, даже если метод @Provides уже был предоставлен - PullRequest
0 голосов
/ 01 октября 2019

Я новичок в Dagger 2. Я пытаюсь создать простое приложение, которое имеет 2 действия: действие входа в систему и основное действие, которое открывается, когда пользователь входит в систему из действия входа в систему. У меня есть 3 области видимости @Singleton, @UserScope и @ActivityScope. Я использую субкомпоненты.

AppComponent.kt является корневым компонентом и предоставляет UserComponent и LoginActivityComponent

@Singleton
@Component(modules=[ApplicationModule::class])
interface ApplicationComponent {
    // subcomponents
    fun plus(userModule: UserModule): UserComponent
    fun plus(loginActivityModule: LoginActivityModule): LoginActivityComponent
}

AppModule

@Module
class ApplicationModule (private val baseApp: BaseApp, private val applicationContext: Context) {

    @Provides
    @Singleton
    fun provideApplication(): Application = baseApp

    @Provides
    @Singleton
    fun provideApplicationContext(): Context = applicationContext
}

UserComponent предоставляет MainActivityComponent

@UserScope
@Subcomponent(modules=[UserModule::class])
interface UserComponent {
    // subcomponent
    fun plus (mainActivityModule: MainActivityModule):MainActivityComponent
}

MainActivityComponent.kt

@ActivityScope
@Subcomponent(modules=[MainActivityModule::class])
interface MainActivityComponent {
    fun inject(mainActivity: MainActivity)
}

Теперь у MainActivityModule есть метод @Provide MainPresenter, потому что мне нужно добавить его в MainActivity

@Module
class MainActivityModule(private val mainActivity: MainActivity) {

    @Provides
    @ActivityScope
    fun provideMainActivity(): MainActivity = mainActivity

    @Provides
    @ActivityScope
    fun provideMainPresenter(): MainPresenter = MainPresenterImpl()

}

MainActivity

class MainActivity: BaseActivity(), MainView {

@Inject
lateinit var presenter: MainPresenter

@Inject
lateinit var user: User


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setupActivityComponent()
    presenter.attachView(this)
    logoutButton.setOnClickListener {
        presenter.onLogoutButtonClicked()
    }
}

override fun setupActivityComponent() {
    BaseApp.instance.getUserComponent()?.plus(MainActivityModule(this))?.inject(this)
}

}

Однако компилятор жалуется: [app.di.component.MainActivityComponent.inject (app.ui.main.MainActivity)] app.ui.main.MainPresenter не может быть предоставлен без @Предоставляет или @ производит аннотированный метод. открытый абстрактный интерфейс ApplicationComponent {^ app.ui.main.MainPresenter внедряется в app.ui.main.MainActivity.presenter app.ui.main.MainActivity внедряется в app.di.component.MainActivityComponent.inject (mainActivity)

...