如何将Android Application中的变量注入WorkViewModel?
问题描述
我在自定义的Application类中定义了一个变量,需要将其注入到WorkViewModel中。
我的SageApplication代码如下:
@HiltAndroidApp class SageApplication : Application() { val applicationScope = CoroutineScope(SupervisorJob()) }
但直接通过@ApplicationContext获取的上下文没有我自定义的applicationScope属性,无法直接获取:
@HiltViewModel class WorkViewModel @Inject constructor( @ApplicationContext private val applicationContext: ApplicationContext ) : ViewModel() { }
我尝试用@Provides来提供applicationScope,但不确定这种方式是否正确:
@InstallIn(SingletonComponent::class) @Module class ApplicationModule { @Provides fun provideApplicationScope(@ApplicationContext application: SageApplication) = application.applicationScope }
我希望能直接将applicationScope注入到WorkViewModel中,如下所示:
@HiltViewModel class WorkViewModel @Inject constructor( private val applicationScope: CoroutineScope ) : ViewModel()
请问我该如何实现?
实现方案
你的思路是对的,通过@Provides提供applicationScope的方式完全可行,只需注意以下细节:
- 添加单例注解:
applicationScope是Application级别的全局变量,属于单例,给@Provides方法加上@Singleton注解,确保每次注入的都是同一个实例:
@InstallIn(SingletonComponent::class) @Module class ApplicationModule { @Provides @Singleton fun provideApplicationScope(application: SageApplication): CoroutineScope { return application.applicationScope } }
这里不需要用@ApplicationContext修饰参数,Hilt能识别到标注了@HiltAndroidApp的自定义Application类,可直接注入。
- 直接注入ViewModel:完成Module配置后,就能按你期望的方式在
WorkViewModel中直接注入CoroutineScope:
@HiltViewModel class WorkViewModel @Inject constructor( private val applicationScope: CoroutineScope ) : ViewModel() { // 此处可直接使用applicationScope执行跨ViewModel、长期运行的任务 }
- 生命周期注意点:
applicationScope的生命周期与Application一致,进程存活期间不会被销毁,因此ViewModel销毁时无需手动取消该Scope;如果是ViewModel专属的协程,建议使用viewModelScope。
内容的提问来源于stack exchange,提问作者SageJustus
相关产品推荐
相关产品推荐

