我是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)]如果没有@Provides或@Produces注释的方法,则无法提供app.ui.main.MainPresenter。 公共抽象接口ApplicationComponent { ^ app.ui.main.MainPresenter在以下位置注入 app.ui.main.MainActivity.presenter app.ui.main.MainActivity在以下位置注入 app.di.component.MainActivityComponent.inject(mainActivity)