Android WorkManager Worker can not be injected using Dagger Hilt `@WorkerInject`(无法使用Dagger Hilt`@WorkerInject`注入Android WorkManager Worker)
问题描述
我正在尝试按照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
替换为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项目来复制它。项目是attached to the issue#158843197。所有密钥文件源代码快照都位于GitHub Gist(如果您想快速查看)。
更新2:解决方案
除了Ianmentioned below,问题是我错过了app/build.gradle
中的Gradle依赖(在aosp#158843197中提到)
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
Worker
的依赖项注入现在正在工作。
推荐答案
更新(2021年3月24日):
从androidx.work-*
版本2.6.0-alpha01
开始,WorkManager
使用androidx.startup
初始化WorkManager。有关对
AndroidManifest.xml
所需的新更改,请检查this答案。
原始答案:
根据WorkManager Configuration and Initialization documentation,要在Application
上使用Configuration.Provider
接口,您必须remove the default initializer:
<!-- In your AndroidManifest.xml -->
<provider
android:name="androidx.work.impl.WorkManagerInitializer"
android:authorities="${applicationId}.workmanager-init"
tools:node="remove" />
否则,默认初始值设定项仍将运行,并清除您的自定义初始化及其HiltWorkerFactory
。
这篇关于无法使用Dagger Hilt`@WorkerInject`注入Android WorkManager Worker的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:无法使用Dagger Hilt`@WorkerInject`注入Android WorkManag
基础教程推荐
- UINavigationItem 的持久 rightBarButtonItem 属性 2022-01-01
- iOS4 创建后台定时器 2022-01-01
- 在 iOS 7 下 CCMenu 错位 2022-01-01
- Firebase 云消息传递令牌未生成 2022-01-01
- Android - 如何在runOnUiThread 中将数据传递给Runnable? 2022-01-01
- 更改 UITableView 部分标题的颜色 2022-01-01
- 从 UIWebView 访问元数据 2022-01-01
- EditText 中的 setHintTextColor() 2022-01-01
- 在视图控制器的宽度上水平均匀分布 UIButton 的最简单方法? 2022-01-01
- UINavigationBar 隐藏按钮文本 2022-01-01