我在Android应用程序中使用的是Dagger 2.14.1,最近从2.10进行了迁移。新版本使注入Activity和Fragments变得更加容易,但是我找不到在无法更改构造函数的情况下注入自定义类的方法。使用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)
}
// ...
}
简化的Dagger 2.14.1使用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相当陌生,使用它越多,我就越喜欢它,但是我无法弄清楚如何在无法更改构造函数的情况下注入自定义类。谢谢您的帮助!
答案 0 :(得分:2)
尝试一下:
class App : Application(), HasActivityInjector {
@Inject
lateinit var activityInjector: DispatchingAndroidInjector<Activity>
companion object {
@JvmStatic
lateinit var instance: App
}
@Inject
lateinit var component: ApplicationComponent
override fun onCreate() {
super.onCreate()
instance = this
DaggerApplicationComponent.builder().create(this).inject(this)
}
override fun activityInjector(): AndroidInjector<Activity> = activityInjector
}
然后
object Injector {
@JvmStatic fun get(): ApplicationComponent = App.instance.component
}
现在您可以做
class Converters {
@Inject
protected lateinit var gson: Gson
init {
Injector.get().inject(this)
}