I am trying to follow guide from https://developer.android.com/training/dependency-injection/hilt-jetpack#workmanager and encountered following error
E/WM-WorkerFactory: Could not instantiate com.example.android.hilt.ExampleWorker
java.lang.NoSuchMethodException: <init> [class android.content.Context, class androidx.work.WorkerParameters]
To reproduce the issue, I have added the example code from the gude in the Dagger Hilt Example Repo
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.
And this is how I start the worker from MainActivity
override fun onStart() {
super.onStart()
enqueueWorker(applicationContext)
}
private fun enqueueWorker(context: Context) {
val request = OneTimeWorkRequestBuilder<ExampleWorker>().build()
WorkManager.getInstance(context).enqueue(request)
}
Not sure what exactly is wrong.
UPDATE: I have created a brand new Android project to reproduce it. The project is attached to the issue#158843197. All the key file source code snapshot is available at GitHub Gist (if you want to do a quick review).
UPDATE#2: The solution
On top of what Ian mentioned below, 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'
The dependency injection for Worker
is now working.
Since androidx.work-*
version 2.6.0-alpha01
, WorkManager
uses androidx.startup
to initialize WorkManager.
For the new required changes to AndroidManifest.xml
, check this answer.
As per the 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" />
Otherwise, the default initializer will still run, wiping out your custom intialization and its HiltWorkerFactory
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With