I am new to Dagger 2. I am trying to make a simple app that has 2 activities, a login activity and a main activity, which is opened when user logs in from the login activity. I have 3 scopes @Singleton, @UserScope, and @ActivityScope. I use Subcomponents.
AppComponent.kt is the root component, and it provides UserComponent and 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 provides 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)
}
Now MainActivityModule has @Provide MainPresenter method, cause I need to inject it into 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)
}
}
Yet the compiler complains: [app.di.component.MainActivityComponent.inject(app.ui.main.MainActivity)] app.ui.main.MainPresenter cannot be provided without an @Provides- or @Produces-annotated method. public abstract interface ApplicationComponent { ^ app.ui.main.MainPresenter is injected at app.ui.main.MainActivity.presenter app.ui.main.MainActivity is injected at app.di.component.MainActivityComponent.inject(mainActivity)