6

我开始将 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)
    }
}

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

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

4

2 回答 2

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

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

于 2020-07-08T13:35:34.137 回答
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,您可以定义不同风格的静态 const 变量。

于 2020-07-08T13:31:46.820 回答