21

我正在尝试遵循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 Example Repo中添加了来自 gude 的示例代码

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.
另请注意,替换AppNavigatorAppDatabasewhich is@Singleton无济于事。

这就是我开始工作的方式MainActivity

    override fun onStart() {
        super.onStart()
        enqueueWorker(applicationContext)
    }

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

不确定到底出了什么问题。


更新:我创建了一个全新的 Android 项目来重现它。该项目附加到 issue#158843197GitHub Gist上提供了所有关键文件源代码快照(如果您想快速查看)。


更新#2:解决方案

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

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

的依赖注入Worker现在正在工作。

4

2 回答 2

19

更新(2021 年 3 月 24 日):

androidx.work-*version开始2.6.0-alpha01WorkManager用于androidx.startup初始化 WorkManager。
对于新的所需更改AndroidManifest.xml,请检查答案。

原答案:

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

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

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

于 2020-06-13T04:11:00.680 回答
0

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

于 2021-01-12T09:53:29.693 回答