Как передать аргументы модулю Hilt?

Я начал переносить приложение Dagger на Hilt, сначала я конвертирую AppComponent в автоматически сгенерированный ApplicationComponent Hilt. Поэтому я добавил аннотацию @InstallIn(ApplicationComponent::class) к каждому модулю, относящемуся к этому компоненту.

Теперь я получаю следующую ошибку:

ошибка: [Hilt] Все модули должны быть статическими и использовать статические методы предоставления или иметь видимый конструктор без аргументов.

Он указывает на этот модуль:

@InstallIn(ApplicationComponent::class)
@Module
class AccountModule(private val versionName: String) {

    @Provides
    @Singleton
    fun provideComparableVersion(): ComparableVersion {
        return ComparableVersion(versionName)
    }
}

Ранее в Dagger можно было передавать аргументы в конструктор. Похоже, Хилт этого не допускает.

Как передать аргументы модулю Hilt?


person Micer    schedule 02.07.2020    source источник
comment
Вы не можете передать его в качестве объекта using вместо класса в модулях.   -  person Shalu T D    schedule 02.07.2020
comment
@ShaluTD хорошо, понятно, спасибо. У вас есть идеи, как провести рефакторинг кода, чтобы добиться того же с Hilt?   -  person Micer    schedule 02.07.2020
comment
Вам нужно будет создать versionName внутри модуля, а не передавать его извне. Как это сделать, зависит от того, как вы в настоящее время вычисляете это значение.   -  person Nitrodon    schedule 06.07.2020
comment
Когда вы планируете предоставить другое имя версии? Это в другом вкусе?   -  person Elye    schedule 07.07.2020
comment
Да, это в BuildConfig. Что ж, я думаю, что смогу получить его оттуда внутри модуля, как было предложено.   -  person Micer    schedule 07.07.2020
comment
На самом деле я обнаружил в документации Dagger (dagger.dev/dev-guide), что методы @BindsInstance должны быть предпочел написать @Module с аргументами конструктора и немедленно предоставить эти значения. Поэтому мне, вероятно, следует сначала реорганизовать код, чтобы использовать это, а затем перейти на Hilt.   -  person Micer    schedule 07.07.2020


Ответы (2)


К сожалению, на данный момент рукоять Dagger Hilt разрабатывается с использованием монолитного компонента, в котором только один компонент приложения и один компонент действия автоматически сгенерированы им. См. https://dagger.dev/hilt/monolithic.html.

Следовательно, модули для него должны быть статическими и использовать статические методы предоставления или иметь видимый конструктор без аргументов.

Если вы поместите аргумент в модуль, он выдаст ошибку, указав

[Hilt] All modules must be static and use static provision methods or have a visible, no-arg constructor.

Насколько я понимаю, вы попытаетесь получить номер версии BuildInfo, возможно, самый простой способ - использовать предоставленный BuildInfo.VERSION_NAME, как показано ниже.

@InstallIn(ApplicationComponent::class)
@Module
class AccountModule() {

    @Provides
    @Singleton
    fun provideComparableVersion(): ComparableVersion {
        return ComparableVersion(BuildInfo.VERSION_NAME)
    }
}

Если вы хотите установить его сами, а не полагаться на BuildInfo.VERSION_NAME, вы можете определить статическую константную переменную, которая существует по-разному в разных вариантах.

person Elye    schedule 08.07.2020

@InstallIn(ApplicationComponent::class)
@Module
class AccountModule {
    @Provides
    @Singleton
    fun provideComparableVersion(application: Application): ComparableVersion {
        return ComparableVersion((application as MyApplication).versionName)
    }
}

Если вы не хотите видеть MyApplication, вы можете использовать интерфейс.

person EpicPandaForce    schedule 08.07.2020