You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin迁移Android项目遇Dagger报错:BusModule must be set

解决Dagger报错:BusModule must be set的问题

这个报错的核心原因是Dagger生成的Component Builder需要你显式传入BusModule的实例——虽然你把它定义成了Kotlin的object单例类,但Dagger的代码生成逻辑并不会自动识别并使用这个单例,必须手动绑定才能正常工作。

为什么会出现这个问题?

Kotlin的object类是语言层面的单例,但Dagger在处理模块时,会把object模块当作「需要提供实例的模块」来生成代码。生成的DaggerAppComponent.Builder会自动添加一个busModule()方法,要求你传入模块实例。如果跳过这一步,Dagger就会抛出IllegalStateException,提示模块未被设置。

方案1:手动在Builder中传入BusModule实例

修改MyApplication中的buildComponent方法,添加busModule(BusModule)调用即可:

private fun buildComponent(): AppComponent {
    return DaggerAppComponent.builder()
        .busModule(BusModule) // 显式传入object单例实例
        .build()
}

这样Dagger就能获取到BusModule的实例,正常提供依赖了。

方案2:将BusModule改为普通类(更省心)

如果你不需要BusModule本身是单例,可以直接去掉object关键字,改成普通类:

@Module
class BusModule { // 移除object修饰符
    const val PROVIDER_FRAGMENT_SELECTION = "fragment_selection"
    @Provides
    @Singleton
    @Named(PROVIDER_FRAGMENT_SELECTION)
    fun provideNewFragmentSelection(): PublishSubject<String> {
        return PublishSubject.create()
    }
}

修改后,原来的buildComponent代码不需要任何改动——Dagger会自动创建BusModule的实例,不再需要手动设置模块。

两种方案怎么选?

  • 如果你需要BusModule作为单例存在(比如模块内部有自己的状态需要维护),选择方案1;
  • 如果只是用模块提供依赖,不需要模块本身是单例,方案2更简洁,能避免手动绑定的繁琐。

内容的提问来源于stack exchange,提问作者AndroidDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:08:13