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
相关产品推荐
相关产品推荐

