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

如何在Dagger Hilt中创建具有不同生命周期作用域的两个对象?

如何在Dagger Hilt中创建具有不同生命周期作用域的两个对象?

嘿,你这是被一个误解困住啦——Hilt 根本不要求依赖的作用域和当前对象的作用域完全一致!恰恰相反,宽作用域的依赖完全可以被注入到窄作用域的对象中,这是Hilt支持的常规场景。

你之前的问题其实是没给UseCase加上正确的作用域注解,导致Hilt不知道该怎么处理它的生命周期,才会让你误以为必须和依赖同作用域。我给你理清楚正确的做法:

首先,你的Repository模块完全不用改,保持单例注入就好:

@Module
@InstallIn(SingletonComponent::class)
object RepoModule {
    @Provides
    fun provideMyRepository(/* 你的依赖项 */): MyRepository = MyRepositoryImpl(/* 你的依赖项 */)
}

然后是UseCase的模块,你只需要给provideMyUseCase方法加上@ViewModelScoped注解,明确告诉Hilt这个UseCase的生命周期和ViewModel绑定:

@Module
@InstallIn(ViewModelComponent::class)
object ViewModelModule {
    @Provides
    @ViewModelScoped
    fun provideMyUseCase(myRepo: MyRepository): MyUseCase = MyUseCase(myRepo = myRepo)
}

为啥这样就能行?给你掰扯清楚:

  • @ViewModelScoped注解会让Hilt为每个ViewModel实例创建对应的UseCase实例,当ViewModel被销毁时,这个UseCase也会被回收,完全符合你不想让它一直存在的需求
  • 单例的Repository是全局作用域的,它的生命周期覆盖了所有更窄的作用域(包括ViewModel),所以Hilt可以安全地把它注入到ViewModel作用域的UseCase里

这里再给你提个反向的禁忌:反过来才是绝对不行的——你不能把窄作用域的对象(比如ViewModel作用域的实例)注入到宽作用域的对象(比如单例)中,因为窄作用域的对象可能在宽作用域对象存活期间就被销毁了,会导致空指针或者状态异常。

备注:内容来源于stack exchange,提问作者faritowich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 10:58:06