即使没有提供@Provides方法,也无法提供没有@Provides的对象

时间:2019-10-01 14:58:01

标签: android kotlin dagger-2

我是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)

0 个答案:

没有答案