Android 无法使用 Dagger Hilt `@WorkerInject` 注入 WorkManager Worker
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()
}
}
NOTE: The AppNavigator
is provided in NavigationModule as
@Binds abstract fun bindNavigator(impl: AppNavigatorImpl): AppNavigator
.
Also note, replacing AppNavigator
with AppDatabase
which is @Singleton
does not help.
这就是我从 MainActivity
启动 worker 的方式
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. All the key file source code snapshot is available at GitHub Gist(如果您想快速回顾一下)。
更新#2:解决方案
在伊恩之上 , the issue was I missed following Gradle dependency in app/build.gradle
(mentioned in 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, to use the Configuration.Provider
interface on your Application
, you must remove the default initializer:
<!-- 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 模块。
我正在尝试按照 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()
}
}
NOTE: The
AppNavigator
is provided in NavigationModule as@Binds abstract fun bindNavigator(impl: AppNavigatorImpl): AppNavigator
.
Also note, replacingAppNavigator
withAppDatabase
which is@Singleton
does not help.
这就是我从 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. All the key file source code snapshot is available at GitHub Gist(如果您想快速回顾一下)。
更新#2:解决方案
在伊恩之上 app/build.gradle
(mentioned in 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, to use the Configuration.Provider
interface on your Application
, you must remove the default initializer:
<!-- 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 模块。