android - 迁移到 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
。
解决方案
链接文章中的情况适用于此。
SettingsFragment
请求一个SettingsFragment.Router
.SettingsFragment.Router
取决于SettingsRouter
,并且此绑定在应用程序组件中。SettingsRouter
依赖于ApplicationStateManager
通过@Inject
构造函数。ApplicationStateManager
绑定在您的(生成的)活动子组件中。
因此,您在父组件中有一个绑定,需要在子组件中进行绑定。如文章中所述,解决此问题的最简单方法是移动RoutingModule
到您的活动(或片段)子组件中。
推荐阅读
- windows - 以编程方式将具有写入权限的 IIS_IUSRS 添加到目录
- python - Matplotlib:make_image() 莫名其妙的错误
- java - Java:双数组中的相乘值
- php - 从数据库查询结果中增量拉取数据
- mysql - 如何使用 express-session 实现会话?
- c# - 如何将 Y 轴上的简单向上/向下移动添加到在 X 轴上附加了速度的敌人?
- excel - 方程简化
- macos - 作为 macOS 开发人员,如果我停止在 App Store 中销售我的应用程序,我是否仍然能够向最初下载该应用程序的用户发布更新?
- apostrophe-cms - 创建小部件以列出具有自定义属性的页面
- 3d - 2 绝对位置 xyz 到点之间的相对位置