Android + Kotlin + Hilt + 多模块应用程序:无法从模块访问应用程序类

Die*_*rez 6 android dependency-injection kotlin dagger-2 dagger-hilt

我正在开发一个多模块应用程序 - 也有明确的关注点分离 - 使用 Kotlin,我试图在其中实现 Hilt - 也解耦 - 并且我在从模块访问应用程序类时遇到问题。

首先,我的应用程序的结构:

project
|- App
|- Common
|- Core
|- DTO
|- Repository
Run Code Online (Sandbox Code Playgroud)

模块之间的关系(模块可见性):

Project
|
|- App
|   |- Common
|   |- DTO
|   |- Core
|
|- Common
|   |- DTO
| 
|- Core
|   |- Common
| 
|- DTO
|
|- Repository
|   |- Common
|   |- DTO
Run Code Online (Sandbox Code Playgroud)

好吧,所有模块在其相应的 build.gradle 中都有所需的 Hilt 依赖项和插件。

我有一个 AppSettings 类,其中包含表示所有应用程序配置(如颜色)的常量,以及一个上下文和一个单例 SQLite 数据库实例。

到目前为止,我以静态方式访问所有常量和上下文,一切都工作正常,并且我使用 Wea​​kReference 作为上下文以避免内存泄漏,但有人建议使用这种方式的上下文不利于测试,解耦并使用 DI,这就是我开始使用 Hilt 的原因。

我不知道我的实现是否正确,因为我是 Hilt 的新手,这让我很头疼,但让我们开始吧:

我认为我的 AppSettings 可能是 Hilt 所需的应用程序类,并且由于它随处可用,因此也可以完美地为需要的上下文提供服务。

应用程序设置:

@HiltAndroidApp
class AppSettings : MultiDexApplication() {

    val actionBarTitleColor = "#0D0D0D"
    ...
}
Run Code Online (Sandbox Code Playgroud)

我还不确定是否应该将此应用程序类放在应用程序模块中,或者是否应该将其放在“通用”模块中,该模块可以从所有其他模块访问......

出现这种混乱的原因是,如果我将它放在“Common”中,它将在任何地方都可用,但如果它位于应用程序中,则 Common 无权访问应用程序,而 Common 需要访问配置常量。

另一方面,我也不确定我的 AppSettings 是否应该是 Application 类,或者它只是一个 Hilt 模块会更好......

不管怎样,我正在尝试以多种方式提供配置全局变量,但它们实际上都没有使我的应用程序能够构建。

我的尝试之一是在 Common 中创建一个 Hilt 模块来为 AppSettings 提供服务,如下所示:

@Module
@InstallIn(SingletonComponent::class)
object Dependencies {
    @Provides
    @Singleton
    fun bindsAppSettings(): AppSettings {
        return AppSettings()
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在任何辅助类中我可以这样做:

class TestClass  @Inject constructor() {

    @Inject
    lateinit var appSettings: AppSettings // = Dependencies.bindsAppSettings()

    fun whatever() {
        val color = appSettings.actionBarEndColor
    }
}
Run Code Online (Sandbox Code Playgroud)

但不确定如何初始化 appSettings,注释的代码是否正常(尽管它确实适用于注释的代码)

如果不是创建一个模块来服务 AppSettings,我可以直接将其注入到任何地方,但是如何注入。

最后,我需要的是我的配置类在我的多模块应用程序中的任何位置都可用,但这也适用于我需要注入的任何其他类。

有关如何处理所有模块中可用的应用程序类(或模块中的 AppSettings)的任何帮助。