Kotlin项目中Dagger2重复生成单例实例问题求助
核心问题其实出在Dagger @Singleton的作用范围上——它是组件级单例,而非全局单例。如果每次注入时你都重新构建了AppComponent实例,哪怕给MeterCollection加了@Singleton,每次也都会生成新对象,这就是你遇到的问题根源。
我们一步步来排查和解决:
1. 检查组件实例是否被重复创建
你的组件构建代码是:
DaggerAppComponent .builder() .build() .inject(this)
如果这段代码在多个地方被调用,或者每次需要注入时都执行一次,那每次都会生成全新的AppComponent实例。Dagger中,@Singleton修饰的依赖只会在同一个组件实例内保持单例,不同组件实例会重新创建依赖对象。
解决方案:全局复用AppComponent实例
你需要把AppComponent的实例保存为全局单例,避免每次注入都新建。比如用Kotlin的懒加载单例对象来持有:
// 全局持有组件实例,确保只初始化一次 object AppComponentHolder { val instance: AppComponent by lazy { DaggerAppComponent.builder().build() } } // 注入时复用同一个组件实例 AppComponentHolder.instance.inject(this)
2. 确认组件的inject方法是否正确声明
你的AppComponent目前只定义了meterCollection()方法,但你调用的是inject(this),需要确保组件接口中明确声明了对应类的inject方法,否则Dagger无法正确处理注入逻辑:
@Singleton @Component(modules = [MeterCollectionModule::class]) interface AppComponent { fun meterCollection(): MeterCollection // 替换YourClass为你实际要注入的目标类 fun inject(target: YourClass) }
3. 排查是否存在重复提供依赖的情况
检查项目中是否有其他模块也通过@Provides方法提供了MeterCollection实例,如果有,Dagger可能会根据注入场景选择不同的提供方,导致多实例问题。确保只有MeterCollectionModule中的方法负责提供该类实例。
额外提醒:别混淆Kotlin单例与Dagger单例
如果MeterCollection本身是用Kotlin object声明的全局单例,那无论Dagger如何处理都会是单例,但你这里是通过构造函数创建的,所以必须依赖Dagger的组件单例机制才能保证唯一性。
总结来说,最可能的原因就是你每次注入都新建了AppComponent实例,只要确保组件全局唯一,@Singleton修饰的MeterCollection就会在整个应用中保持单例。
内容的提问来源于stack exchange,提问作者Ahsan Saeed

