【问题标题】:Android Dagger 2.10 to 2.14.1 - Inject Custom ClassAndroid Dagger 2.10 到 2.14.1 - 注入自定义类
【发布时间】: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&lt;App!&gt; 对象。这个对象只有一个.inject() 函数,它只接受我的App 类。所以我不能注入其他任何东西。

当然还有很多遗漏,但我只想贴出相关代码。我的 Dagger 2.14.1 实现工作正常,我在活动、片段和视图模型中的所有依赖项都被注入。

我对 Dagger 还很陌生,我越用越喜欢它,但我不知道如何在无法更改构造函数的地方注入自定义类。感谢您的帮助!

【问题讨论】:

  • 为什么不像以前一样将组件存储在App中?
  • 我扩展了我的问题:简而言之:DaggerApplicationComponent.builder().create(this) 返回一个AndroidInjector&lt;App!&gt; 对象。这个对象只有一个.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 字段,然后继续我的快乐之路(尽管我承认如果你可以为实例级组件,您可能希望将其注入到其他东西中)。嗯……

标签: android dagger-2 dagger


【解决方案1】:

试试这个:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    相关资源
    最近更新 更多