【问题标题】:How to inject WorkManager instance in a ViewModel constructor with Dagger2?如何使用 Dagger2 在 ViewModel 构造函数中注入 WorkManager 实例?
【发布时间】:2020-03-26 19:28:20
【问题描述】:

我想用 Dagger2 注入一个 WorkManager 实例,以便像这样在我的 ViewModel 中使用它

class MyViewModel @Inject constructor(workManager: WorkManager) : ViewModel()

当我尝试为 WorkManager 创建一个模块以提供它的实例时,我收到一条错误消息,提示我无法从抽象类中提供。如何在我的 ViewModel 构造函数中注入 WorkManager 的实例?

【问题讨论】:

    标签: android viewmodel dagger-2 dagger android-workmanager


    【解决方案1】:

    要在没有 Dagger 的情况下获取 WorkManager 的实例,您可以使用 WorkManager.getInstance(context)。要将WorkManager 放入Dagger 的对象图中,我们只需将此代码放入@Provides 方法中。

    @Provides
    // Maybe @Singleton, though it really doesn't matter.
    fun provideWorkManager(context: Context): WorkManager = WorkManager.getInstance(context)
    

    在 Dagger 模块中使用此方法,您将能够在任何地方注入 WorkManager,前提是您的组件可以访问 Context

    【讨论】:

    • 像魅力一样工作。非常感谢@Nitrodon
    • 正确方式:@ApplicationContext appContext: Context
    【解决方案2】:
    @Module
    @InstallIn(SingletonComponent::class)
    object YourModule {    
        @Provides
        @Singleton
        fun provideWorkManager(@ApplicationContext appContext: Context): WorkManager =
            WorkManager.getInstance(appContext)
    }
    

    注入到 ViewModel:

    @HiltViewModel
    class YourViewModel @Inject constructor(
        val workManager: WorkManager
    ) : ViewModel() { 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-07
      • 2015-10-28
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 2021-12-23
      相关资源
      最近更新 更多