假设,我有 ViewModel 类,其构造函数中有一些 UseCase。另一方面,这个 UseCase 在其构造函数中有一个 CoroutineScope。我想使用 viewModelScope 作为参数。我可以用 Hilt 来做吗?
@InstallIn(ViewModelComponent::class)
abstract class ViewModelModule {
@Provides
fun provideUseCase(scope: CoroutineScope) = MyUseCase(scope)
}
...
@HiltViewModel
class MyViewMode(useCase: MyUseCase): ViewModel() {
...
}
据我了解,
ViewModelComponent
只有SavedStateHandle
作为默认绑定,甚至没有ViewModel本身。
如果您的 UseCase 依赖于 ViewModel 的范围,而 ViewModel 的范围又依赖于 UseCase,那么您就会出现依赖循环,并且无法使用 Hilt 来解决它。
您最好传递 UseCase 的提供者,并在 ViewModel 中初始化它,或者更好的是,不要依赖 CoroutineScope,而是创建您的 UseCase 接口
suspend
您可以将 KTX 扩展用于生命周期感知组件,并使用
viewModelScope
扩展。请参阅此处。
要使用 Hilt 将 CoroutineScope(特别是 viewModelScope)注入到
UseCase
中的 ViewModel
中,您可以使用辅助注入。这只是一个三步指南:
为工厂创建一个接口,用于实例化您的用例。该工厂允许您在运行时提供 CoroutineScope。
@Singelton
@AssistedFactory
interface MyUseCaseFactory
{
fun create(scope: CoroutineScope): MyUseCase
}
修改您的用例以通过辅助注入接受 CoroutineScope。此设置允许您在创建 UseCase 实例时注入常规依赖项并指定 CoroutineScope。
class MyUseCase @AssistedInject constructor(
@Assisted scope: CoroutineScope,
/* ... */
) {
/* ... */
}
@HiltViewModel
class MyViewMode(factory: MyUseCaseFactory): ViewModel() {
val useCase = factory.create(viewModelSope)
/* ... */
}