1

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

BuildConfigProvider.kt

interface BuildConfigProvider {

    val version: String

}

AndroidBuildConfigProvider.kt

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

    override val version = BuildConfig.VERSION_NAME
}

安卓模块.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 获取信息到扩展函数中?

我发现这篇文章谈论协程但无法真正理解大头钉。

第三方 Tracker 类的扩展类 (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)
}
4

1 回答 1

2

看起来这个问题已经被问过了:this reference in alazy initializer of kotlin extension property

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

于 2021-02-24T13:53:43.390 回答