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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:34:32