如何在扩展函数中获取 Dagger2 class 属性?
How to get Dagger2 class property in extension function?
我正在使用 Dagger2,并且想在第三方的扩展函数中使用我的应用程序的版本字符串 class。该应用目前公开版本:
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
}
我将此代码添加到扩展函数 class 文件中:
private val configProvider by lazy { DaggerAndroidBuildConfigComponent.builder()
.androidModule(AndroidModule(this)).build().provider }
但是,this
带有红色下划线并带有消息
this is not defined in the current context
有什么方法可以在扩展函数中获取应用程序上下文 class 来构建组件?
或者更一般地说,有没有办法从 AndroidBuildConfigProvider 获取信息到扩展函数中?
我发现 this article 谈论协程,但无法真正理解关键点。
第三方跟踪器 class.
的扩展代码 Class (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:
上被问过了
看看上面的答案对你有没有帮助。
我正在使用 Dagger2,并且想在第三方的扩展函数中使用我的应用程序的版本字符串 class。该应用目前公开版本:
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
}
我将此代码添加到扩展函数 class 文件中:
private val configProvider by lazy { DaggerAndroidBuildConfigComponent.builder()
.androidModule(AndroidModule(this)).build().provider }
但是,this
带有红色下划线并带有消息
this is not defined in the current context
有什么方法可以在扩展函数中获取应用程序上下文 class 来构建组件?
或者更一般地说,有没有办法从 AndroidBuildConfigProvider 获取信息到扩展函数中?
我发现 this article 谈论协程,但无法真正理解关键点。
第三方跟踪器 class.
的扩展代码 Class (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:
看看上面的答案对你有没有帮助。