【发布时间】:2018-08-09 16:27:23
【问题描述】:
我在我的 Android 应用程序中使用 Dagger 2.14.1,并且最近从 2.10 迁移。新版本使注入活动和片段变得更加容易,但我找不到注入自定义类的方法,我也无法更改构造函数。使用 2.10,我可以编写自定义注入函数,然后使用它们简单地注入任何类:
使用 Kotlin 简化 Dagger 2.10 注入:
@Singleton
@Component(dependencies = [], modules = [ApplicationModule::class, ...])
interface ApplicationComponent {
fun application(): App
fun inject(authenticationActivity: AuthenticationActivity)
fun inject(converters: Converters)
// ...
}
class App : Application() {
companion object {
@JvmStatic
lateinit var component: ApplicationComponent
}
override fun onCreate() {
super.onCreate()
component = DaggerApplicationComponent.builder()
.applicationModule(ApplicationModule(this))
.build()
}
}
// This class is used by the Room database framwork and I cannot change the constructor and do class Converters @Inject constructor(private val gson: Gson) {
class Converters {
@Inject
protected lateinit var gson: Gson
init {
App.component.inject(this)
}
// ...
}
Simplified Dagger 2.14.1 Injection with Kotlin 没有为我提供 ApplicationComponent 对象来注入我的自定义类:
@Singleton
@Component(modules = [ApplicationModule::class, ...])
interface ApplicationComponent : AndroidInjector<App> {
@Component.Builder
abstract class Builder : AndroidInjector.Builder<App>()
fun inject(converters: Converters) // doesn't work!
}
class App : Application(), HasActivityInjector {
@Inject
lateinit var activityInjector: DispatchingAndroidInjector<Activity>
override fun onCreate() {
super.onCreate()
// From where do I get my component to call .inject() from another class?
DaggerApplicationComponent.builder().create(this).inject(this)
}
override fun activityInjector(): AndroidInjector<Activity> = activityInjector
}
简而言之:DaggerApplicationComponent.builder().create(this) 返回一个 AndroidInjector<App!> 对象。这个对象只有一个.inject() 函数,它只接受我的App 类。所以我不能注入其他任何东西。
当然还有很多遗漏,但我只想贴出相关代码。我的 Dagger 2.14.1 实现工作正常,我在活动、片段和视图模型中的所有依赖项都被注入。
我对 Dagger 还很陌生,我越用越喜欢它,但我不知道如何在无法更改构造函数的地方注入自定义类。感谢您的帮助!
【问题讨论】:
-
为什么不像以前一样将组件存储在
App中? -
我扩展了我的问题:简而言之:
DaggerApplicationComponent.builder().create(this)返回一个AndroidInjector<App!>对象。这个对象只有一个.inject()函数,它只接受我的App类。所以我不能注入其他任何东西。除了我的App,我根本无法注入其他任何东西。 -
啊哈。我认为您可以在
App类中执行@Inject lateinit var component: AppComponent,它应该可以工作。 -
哈!太好了,它起作用了,我现在可以在我的
Application类中本地注入我的Converters类。但是,有一个问题,当我将我的@Inject lateinit var component: ApplicationComponent放入companion object中时,我得到一个匕首异常:error: Dagger does not support injection into static fields。关于如何让其他自定义类可以将其注入到init {}块中的任何想法? -
我只需要在
companion object中添加一个val component: AppComponent get() = appInstance.component和一个appInstance字段,然后继续我的快乐之路(尽管我承认如果你可以为实例级组件,您可能希望将其注入到其他东西中)。嗯……