问题描述
我正在使用 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
看看那里的答案是否对您有帮助。