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

How to pass arguments to Hilt module?

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

现在我得到以下错误:

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

指向这个模块:

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

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

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

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

不幸的是,目前 Dagger Hilt 是使用单体组件设计的,其中只有一个应用程序组件和一个由它自动生成的 Activity 组件。参考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,你可以定义不同风格的静态常量变量。

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

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