如何在扩展函数中获取 Dagger2 类属性?

问题描述

我正在使用 Dagger2,并且想在第三方类的扩展函数中使用我的应用程序的版本字符串。该应用程序当前公开版本:

BuildConfigProvider.kt

interface BuildConfigProvider {

    val version: String

}

AndroidBuildConfigProvider.kt

class AndroidBuildConfigProvider @Inject constructor(
    context: Context
): BuildConfigProvider {

    override val version = BuildConfig.VERSION_NAME
}

AndroidModule.kt

@Module
class AndroidModule(private val app: Application) {

    @Provides
    @Singleton
    fun providesApplication(): Application = app

    @Provides
    @Singleton
    fun providesContext(): Context = app

    @Provides
    @Singleton
    fun providesBuildConfigProvider(provider: AndroidBuildConfigProvider)
            : BuildConfigProvider = provider


}  

我在一个不同的扩展函数中看到了这段代码,并决定遵循这个模式

private val mapper by lazy { DaggerGSONMapper.builder().build().mapper}

所以我创建了一个组件 AndroidBuildConfigComponent

 @Component(
        modules = [
            AndroidModule::class
        ]
    )
    @Singleton
    interface AndroidBuildConfigComponent {
    
        val provider: BuildConfigProvider
    
    }

我将此代码添加到扩展函数文件中:

private val configProvider by lazy { DaggerAndroidBuildConfigComponent.builder()
                                    .androidModule(AndroidModule(this)).build().provider }

但是,this 带有红色下划线,带有一条消息

这在当前上下文中没有定义

有什么办法可以在扩展函数类中获取应用上下文来构建组件吗?

或者更一般地说,有没有办法从 AndroidBuildConfigProvider 获取信息到扩展函数中?

我发现 this article 谈到了协程,但无法真正理解这些技巧。

第三方跟踪器类的扩展类代码 (TrackerExt.kt)。

private val configProvider by lazy { DaggerAndroidBuildConfigComponent.builder()
                                    .androidModule(AndroidModule(this)).build().provider }
// Above has a compile error on `this`

fun Tracker.trackEvent(name: String) {
   Log.d("Name",name)
   Log.d("Version",configProvider.version)
}

解决方法

看起来这个问题已经在 SO 上问过了:this reference in a lazy initializer of kotlin extension property

看看那里的答案是否对您有帮助。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...