Невозможно внедрить Android WorkManager Worker с помощью Dagger Hilt `@WorkerInject`

Я пытаюсь следовать руководству https://developer.android.com/training/dependency-injection/hilt-jetpack и обнаружил следующую ошибку

E/WM-WorkerFactory: Could not instantiate com.example.android.hilt.ExampleWorker
    java.lang.NoSuchMethodException: <init> [class android.content.Context, class androidx.work.WorkerParameters]

Чтобы воспроизвести проблему, я добавил пример кода из gude в репозиторий примеров 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.
Также обратите внимание на заменуAppNavigator с AppDatabase который @Singleton не помогает.

И вот так я начинаю воркер с 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: Решение

Вдобавок к тому, что Ян упомянул ниже, проблема заключалась в том, что я упустил из-за зависимости Gradle вapp/build.gradle(упоминается в AOSP № 158843197)

kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01'

Внедрение зависимости для Worker сейчас работает.

2 ответа

Решение

Согласно документации по настройке и инициализации WorkManager, чтобы использоватьConfiguration.Provider интерфейс на вашем Application, вы должны удалить инициализатор по умолчанию:

<!-- In your AndroidManifest.xml -->
<provider
    android:name="androidx.work.impl.WorkManagerInitializer"
    android:authorities="${applicationId}.workmanager-init"
    tools:node="remove" />

В противном случае инициализатор по умолчанию все равно будет работать, уничтожая вашу пользовательскую инициализацию и ее HiltWorkerFactory.

У меня была аналогичная проблема, но в моем случае мне пришлось использовать модули Hilt с аннотацией @Provides вместо аннотации @Binds. Я не мог внедрить модули Hilt с аннотацией @Binds.

Другие вопросы по тегам