如何在 Kotlin 中注入原始变量?

Posted

技术标签:

【中文标题】如何在 Kotlin 中注入原始变量?【英文标题】:How to inject primitive variables in Kotlin? 【发布时间】:2017-11-26 19:19:54 【问题描述】:

我在我的 android 应用程序中将 Dagger2 用于 DI,并且使用此代码将类注入到我的 Activity 中很好:

@field:[Inject ApplicationContext]
lateinit var context: Context

但是,lateinit Kotlin 中的原始类型属性不允许使用修饰符(例如 Boolean),我该怎么做?

@field:[Inject Named("isDemo")]
lateinit var isDemo: Boolean

当我从此代码中删除 lateinit 时,我收到此错误 Dagger does not support injection into private fields

【问题讨论】:

@JvmField @field:[Inject Named("isDemo")] var isDemo: Boolean = false @Miha_x64 以及 Inject 和 Named 注释在哪里?! @Miha_x64 谢谢,它有效! @Miha_x64 请添加您的答案。给 cmets 点赞太无聊了。 【参考方案1】:

首先,您不需要lateinit,您可以将其保留为var,并使用任意值进行初始化。 其次,您必须公开一个字段以允许 Dagger 在那里注入。 所以,这是解决方案:

@JvmField // expose a field
@field:[Inject Named("isDemo")] // leave your annotatios unchanged
var isDemo: Boolean = false // set a default value

【讨论】:

如果您想保护仅在(子)类中访问(和更改)的属性,也许您应该考虑protected true - 与 Dagger 一起使用,因为这不会导致private 这行得通。谢谢。这有点乱。希望 dagger/kotlin 解决这个问题。【参考方案2】:

接受的答案对我不起作用,但以下方法效果很好:

@set:[Inject Named("isDemo")]
var isDemo: Boolean = false

Source

【讨论】:

对我来说,只接受接受的答案,而不是你的。在您的情况下,我收到错误“Dagger 不支持注入私有字段”

以上是关于如何在 Kotlin 中注入原始变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android/Kotlin App 上通过 Koin 注入在 BaseActivity 中初始化/注入通用 ViewModel

如何通过变量/方法将Django模板代码注入模板?

如何在用 Kotlin 编写的 JUnit 5 测试类中注入 Spring bean?

如何使用 SpringBoot2、JUnit5 和 Kotlin 将配置属性注入单元测试

如何在 Jackson 中将原始 json 字符串注入到字段中?

如何使用 Koin 依赖注入 (Kotlin) 检索与给定类型匹配的所有实例