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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 23:15:27