Я новичок в 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)