Android Dagger 2.10至2.14.1-注入自定义类

时间:2018-08-09 16:27:24

标签: android dagger-2 dagger

我在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相当陌生,使用它越多,我就越喜欢它,但是我无法弄清楚如何在无法更改构造函数的情况下注入自定义类。谢谢您的帮助!

1 个答案:

答案 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)
    }