Android Dagger 2.10 to 2.14.1 - Inject Custom Class
我在Android应用程序中使用Dagger 2.14.1,最近从2.10进行了迁移。新版本使注入Activity和Fragments变得更加容易,但是在无法更改构造函数的情况下,我无法找到注入自定义类的方法。使用2.10,我可以编写自定义注入函数,然后使用它们简单地注入任何类:
Kotlin简化的Dagger 2.10注射:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | @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对象来注入我的自定义类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | @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 } |
简而言之:
当然有很多遗漏,但是我只想发布相关代码。我的Dagger 2.14.1实现工作正常,并且我在"活动","片段"和"视图模型"中的所有依赖项都已注入。
我对Dagger相当陌生,使用它越多,我就越喜欢它,但是我不知道如何在无法更改构造函数的情况下注入自定义类。感谢您的帮助!
试试这个:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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 } |
然后
1 2 3 | object Injector { @JvmStatic fun get(): ApplicationComponent = App.instance.component } |
现在你可以做
1 2 3 4 5 6 7 8 | class Converters { @Inject protected lateinit var gson: Gson init { Injector.get().inject(this) } |