![](/img/trans.png)
[英]Couldn't inject @Binds Hilt Dependencies in WorkManager using @WorkerInject
[英]Android WorkManager Worker can not be injected using Dagger Hilt `@WorkerInject`
我正在尝试遵循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()
}
}
注意:
AppNavigator
在NavigationModule中以@Binds abstract fun bindNavigator(impl: AppNavigatorImpl): AppNavigator
的形式提供。
另请注意,将AppNavigator
替换为@Singleton
的AppDatabase
并没有帮助。
这就是我从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#158843197 。 GitHub Gist上提供了所有关键文件源代码快照(如果您想快速查看)。
更新#2:解决方案
除了下面提到的 Ian 之外,问题是我错过了app/build.gradle
中的 Gradle 依赖项(在aosp#158843197中提到)
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
Worker
的依赖注入现在正在工作。
从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
。
我遇到了类似的问题,但就我而言,我必须使用带有 @Provides 注释而不是 @Binds 注释的 Hilt 模块。 我无法使用 @Binds 注释注入 Hilt 模块。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.