@AssistedInject с @HiltWorker не работает после обновления gradle.

Вопрос или проблема

После некоторых обновлений зависимостей (включая версию gradle и kotlin) старый код больше не компилируется в релизной сборке

Произошла ошибка

ошибка: [Dagger/MissingBinding] b.a не может быть предоставлен без
@Inject конструктора или метода с аннотацией @Provides.

Код:

@HiltWorker
class PeriodicReminderWorker @AssistedInject constructor(
    @Assisted context: Context,
    @Assisted workerParameters: WorkerParameters,
    private val reminderProcessor: ReminderProcessor
) : CoroutineWorker(context, workerParameters) {
    override suspend fun doWork(): Result {
        reminderProcessor.invoke(forceUpdateReminders = true)
        return Result.success()
    }
}

В старой ветке всё работает как и прежде. В текущей работает также в отладочной сборке

Gradle был обновлён с 8.3.2 до 8.7.1

Kotlin – с 2.0.10 до 2.0.21

gradle wrapper – с 8.6 до 8.9

Ответ или решение

Когда вы сталкиваетесь с ошибкой компиляции после обновления Gradle и Kotlin в проекте Android, особенно когда код работал раньше, важно понять, что могло вызвать эту проблему. В вашем случае код не компилируется при создании выпуска, и ошибка, которую вы наблюдаете:

error: [Dagger/MissingBinding] b.a cannot be provided without an @Inject constructor or an @Provides-annotated method.

указывает на отсутствие возможности предоставления зависимости для класса PeriodicReminderWorker, который использует аннотацию @AssistedInject.

Проблема и причина

  1. Изменения в Dagger и Hilt: Обновления Gradle и Kotlin могут привести к изменению в использовании библиотек зависимостей, таких как Dagger и Hilt. Более новые версии могут вводить изменения в том, как зависимости обрабатываются, и в некоторых случаях могут потребовать дополнительных аннотаций или конфигурации.

  2. Проблемы с @AssistedInject: Когда вы используете @AssistedInject, Dagger ожидает, что вы предоставите какие-то вспомогательные зависимости (в вашем случае Context и WorkerParameters). Ошибка, которую вы видите, говорит о том, что Dagger не может найти способ обеспечить одну из необходимых зависимостей.

Решение

  1. Проверьте зависимости: Убедитесь, что вы обновили версии всех зависимостей, связанных с Dagger и Hilt, и что они совместимы друг с другом. Например, для Hilt вам может потребоваться добавить следующее в файл build.gradle:

    implementation "com.google.dagger:hilt-android:X.Y.Z"
    kapt "com.google.dagger:hilt-compiler:X.Y.Z"

    Замените X.Y.Z на актуальные версии в соответствии с документацией.

  2. Обновите @HiltWorker: Убедитесь, что вы используете правильный подход для создания Hilt Worker. Модифицируйте ваш PeriodicReminderWorker, чтобы использовать @AssistedInject правильно. Например:

    @HiltWorker
    class PeriodicReminderWorker @AssistedInject constructor(
       @Assisted context: Context,
       @Assisted workerParameters: WorkerParameters,
       private val reminderProcessor: ReminderProcessor
    ) : CoroutineWorker(context, workerParameters) {
       override suspend fun doWork(): Result {
           reminderProcessor.invoke(forceUpdateReminders = true)
           return Result.success()
       }
    
       @AssistedInject.Factory
       interface Factory {
           fun create(
               context: Context,
               workerParameters: WorkerParameters
           ): PeriodicReminderWorker
       }
    }
  3. Добавьте Hilt Android App: Убедитесь, что ваш класс приложения аннотирован с @HiltAndroidApp. Это может выглядеть так:

    @HiltAndroidApp
    class MyApp : Application() { }
  4. Обновите Dagger/Hilt версии: Если изменения в Hilt с новой версией Gradle и Kotlin требуют обновления аннотаций или другие изменения в конфигурации, убедитесь, что у вас установлены последние рекомендации из документации. Например, проверки могут включать:

    kapt {
       correctErrorTypes = true
    }
  5. Синхронизация Gradle: После внесения изменений обязательно выполните синхронизацию Gradle, перезапустите компиляцию вашего проекта. Убедитесь, что в Gradle вы используете правильные версии и что они указаны в зависимости.

Заключение

После выполнения вышеописанных шагов и проверки всех зависимостей ваша проблема с компиляцией должна быть разрешена. Если ошибка сохраняется, обратитесь к документации Dagger и Hilt, так как они могут содержать информацию об изменениях в использовании аннотаций и других компонентов. Крайне важно следить за новыми версиями библиотек и адаптировать код в соответствии с их рекомендациями.

Оцените материал
Добавить комментарий

Капча загружается...