Android WorkManager的Worker无法使用Dagger Hilt `@WorkerInject`进行注入

24

我正在尝试遵循https://developer.android.com/training/dependency-injection/hilt-jetpack#workmanager的指南,但遇到了以下错误。

E/WM-WorkerFactory: Could not instantiate com.example.android.hilt.ExampleWorker
    java.lang.NoSuchMethodException: <init> [class android.content.Context, class androidx.work.WorkerParameters]
为了重现问题,我已经添加了来自Dagger Hilt示例存储库中的示例代码。
class ExampleWorker @WorkerInject constructor(
    @Assisted appContext: Context,
    @Assisted workerParams: WorkerParameters,
    val workerDependency: AppNavigator
) : Worker(appContext, workerParams) {
    override fun doWork(): Result {
        Log.d("WORKER", "I am the worker, got dependency: $workerDependency")
        return Result.success()
    }
}
注意: AppNavigatorNavigationModule 中提供,如下所示:@Binds abstract fun bindNavigator(impl: AppNavigatorImpl): AppNavigator
还要注意,用 @Singleton 标记的 AppDatabase 替换 AppNavigator 是无效的。同时这是我在 MainActivity 中启动工作程序的方式。
    override fun onStart() {
        super.onStart()
        enqueueWorker(applicationContext)
    }

    private fun enqueueWorker(context: Context) {
        val request = OneTimeWorkRequestBuilder<ExampleWorker>().build()
        WorkManager.getInstance(context).enqueue(request)
    }

不确定问题出在哪里。


更新:我创建了一个全新的Android项目来再现它。该项目已经附加到问题#158843197。所有关键的文件源代码快照可在GitHub Gist中获取(如果您想进行快速查看)。


更新#2:解决方案

除了Ian在下面提到的之外,问题在于我在app/build.gradle中错过了以下Gradle依赖项(在aosp#158843197中提到)。

kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01'

Worker的依赖注入现在已经起作用。


已在问题跟踪器(https://issuetracker.google.com/issues/158843197)上报告了此问题。 - Hossain Khan
2个回答

23

更新(2021年3月24日):

androidx.work-*版本2.6.0-alpha01以来,WorkManager使用androidx.startup来初始化WorkManager
有关AndroidManifest.xml的新要求更改,请参见此答案

原始回答:

根据WorkManager配置和初始化文档,要在Application上使用Configuration.Provider接口,必须删除默认初始化程序

<!-- In your AndroidManifest.xml -->
<provider
    android:name="androidx.work.impl.WorkManagerInitializer"
    android:authorities="${applicationId}.workmanager-init"
    tools:node="remove" />

否则,默认的初始化程序仍将运行,覆盖您的自定义初始化及其 HiltWorkerFactory

1
谢谢Ian,我之前不知道这个。我已经在清单文件中应用了规则,并使用“分析APK”验证记录是否从合并的清单文件中删除。然而,我仍然遇到相同的错误。抱歉,可能是我忽略了一些微小的东西。 - Hossain Khan
1
我曾经遇到同样的问题,这个答案解决了它,谢谢。如果在Hilt+WorkManager指南中包含了这个片段(或一些提示),那么可能会更有帮助。 - jorgeavilae
3
@jorgeavilae - 我强烈建议您提交文档问题,以便添加链接。 - ianhanniballake
2
我在https://issuetracker.google.com/issues/158891026上报了文档混淆问题。 - Hossain Khan
无法实例化,无法创建工作程序。 - user924
显示剩余3条评论

0

我遇到了类似的问题,但是在我的情况下,我必须使用带有@Provides注释的Hilt模块,而不是@Binds注释。 我无法使用@Binds注释注入Hilt模块。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接