使用 Hilt 获取 ViewModel 的协程作用域

问题描述 投票:0回答:2

假设,我有 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本身。

android android-viewmodel dagger-hilt coroutinescope
2个回答
1
投票

如果您的 UseCase 依赖于 ViewModel 的范围,而 ViewModel 的范围又依赖于 UseCase,那么您就会出现依赖循环,并且无法使用 Hilt 来解决它。

您最好传递 UseCase 的提供者,并在 ViewModel 中初始化它,或者更好的是,不要依赖 CoroutineScope,而是创建您的 UseCase 接口

suspend

您可以将 KTX 扩展用于生命周期感知组件,并使用

viewModelScope
扩展。请参阅此处


0
投票

要使用 Hilt 将 CoroutineScope(特别是 viewModelScope)注入到

UseCase
中的
ViewModel
中,您可以使用辅助注入。这只是一个三步指南:

  1. 为用例定义辅助工厂:

为工厂创建一个接口,用于实例化您的用例。该工厂允许您在运行时提供 CoroutineScope。

@Singelton
@AssistedFactory
interface MyUseCaseFactory
{
    fun create(scope: CoroutineScope): MyUseCase
} 
  1. 通过辅助注射实现您的用例:

修改您的用例以通过辅助注入接受 CoroutineScope。此设置允许您在创建 UseCase 实例时注入常规依赖项并指定 CoroutineScope。

class MyUseCase @AssistedInject constructor(
    @Assisted scope: CoroutineScope,
    /* ... */
) {
 /* ... */
}
  1. 将工厂注入ViewModel并创建用例: 在您的 ViewModel 中,注入工厂。使用它来创建 UseCase 的实例,并将 viewModelScope 作为参数传递。
    @HiltViewModel
    class MyViewMode(factory: MyUseCaseFactory): ViewModel() {
        val useCase = factory.create(viewModelSope)
        /* ... */
    }
© www.soinside.com 2019 - 2024. All rights reserved.