如何将参数传递给 Hilt 模块?

Mic*_*cer 9 android dagger-2 dagger-hilt

我开始将 Dagger 应用程序迁移到 Hilt,首先我将 AppComponent 转换为 Hilt 自动生成的 ApplicationComponent。因此,我@InstallIn(ApplicationComponent::class)为与该组件相关的每个模块添加了注释。

现在我收到以下错误:

错误:[Hilt] 所有模块必须是静态的并使用静态提供方法或具有可见的无参数构造函数。

它指向这个模块:

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

    @Provides
    @Singleton
    fun provideComparableVersion(): ComparableVersion {
        return ComparableVersion(versionName)
    }
}
Run Code Online (Sandbox Code Playgroud)

以前在 Dagger 中,可以在构造函数中传递参数。看来希尔特不允许这样做。

如何将参数传递给 Hilt 模块?

Epi*_*rce 8

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

如果您不想看到MyApplication,那么您可以使用界面。


Ely*_*lye 1

不幸的是,目前 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你想自己设置而不是依赖BuildInfo.VERSION_NAME,你可以定义静态 const 变量,这些变量在不同风格中存在不同。