首页 > 解决方案 > 迁移到 2.17 后 Dagger 失败

问题描述

我有两个模块:app:settings. 这是我的匕首配置。

我的组件:

@ApplicationScope
@Component(
    modules = [
        AndroidInjectionModule::class,
        AndroidSupportInjectionModule::class,
        RoutingModule::class,
        SettingsModule::class
    ]
)
interface ELanguageComponent {

    @Component.Builder
    interface Builder {

        @BindsInstance
        fun application(application: Application): Builder
        fun build(): ELanguageComponent
    }

    fun inject(application: BaseELanguageApplication)
}

RoutingModule:_

@Module
class RoutingModule {

    @Provides
    fun ProvidesettingsFragmentRouter(router: SettingsRouter): SettingsFragment.Router = router
}

SettingsRouter:_

class SettingsRouter @Inject constructor(
    private val applicationStateManager: ApplicationStateManager
) : SettingsFragment.Router

SettingsModule:_

@Module
abstract class SettingsModule {

    @ActivityScope
    @ContributesAndroidInjector(modules = [SettingsFragmentModule::class, ApplicationStateManagerModule::class])
    abstract fun settingsActivity(): SettingsActivity
}

@Module
abstract class ApplicationStateManagerModule {

    @Module
    companion object {

        @JvmStatic
        @Provides
        fun bindApplicationStateManager(settingsActivity: SettingsActivity): ApplicationStateManager = settingsActivity
    }
}

我的SettingsFragmentModule

@Module
abstract class SettingsFragmentModule {

    @FragmentScope
    @ContributesAndroidInjector
    abstract fun settingsFragment(): SettingsFragment
}

并且SettingsFragment.Router注入到我的内部SettingsFragment

class SettingsFragment : DaggerFragment() {

  @Inject
  lateinit var router: Router
  
  ...
}

我已经找到并阅读了这篇文章,但它并没有多大帮助,因为错误不是那么解释性:

[Dagger/MissingBinding] com.altissia.common.authentication.ApplicationStateManager 不能在没有 @Provides-annotated 方法的情况下提供。公共抽象接口 ELanguageComponent { ^ com.altissia.common.authentication.ApplicationStateManager 在 com.altissia.router.SettingsRouter(applicationStateManager, ...) 处注入 com.altissia.router.SettingsRouter 在 com.altissia.injection.module.RoutingModule 处注入。 ProvidesettingsFragmentRouter(router) com.altissia.settings.fragment.SettingsFragment.Router 在 com.altissia.settings.fragment.SettingsFragment.router 注入 com.altissia.settings.fragment.SettingsFragment 在 dagger.android.AndroidInjector.inject(T ) [com.altissia.injection.component.ELanguageComponent → com.altissia.settings.injection.module.SettingsModule_SettingsActivity.SettingsActivitySubcomponent → com.altissia。

我在这里想念什么?ApplicationStateManager是通过ApplicationStateManagerModule里面安装的SettingsModule

标签: androiddependency-injectiondagger-2

解决方案


链接文章中的情况适用于此。

  • SettingsFragment请求一个SettingsFragment.Router.
  • SettingsFragment.Router取决于SettingsRouter,并且此绑定在应用程序组件中。
  • SettingsRouter依赖于ApplicationStateManager通过@Inject构造函数。
  • ApplicationStateManager绑定在您的(生成的)活动子组件中。

因此,您在父组件中有一个绑定,需要在子组件中进行绑定。如文章中所述,解决此问题的最简单方法是移动RoutingModule到您的活动(或片段)子组件中。


推荐阅读