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

