我正在尝试遵循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()
}
}
注意: AppNavigator
在 NavigationModule 中提供,如下所示:@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
的依赖注入现在已经起作用。