android - 如何通过 DI (Koin) 向 @BindingAdapter 方法提供某些内容?

标签 android dependency-injection android-databinding android-glide koin

如果通过其他方式可以更轻松地解决这个问题,我会很高兴听到,但现在就是这样。

我想以某种方式为我的 @BindingAdapter 方法提供一个 Glide 实例,以便我可以创建它一次。我目前在这里通过 Koin 提供此内容:

val glideModule = module {
    single { provideRequestOptions() }
    single { provideRequestManager(androidApplication(), get()) }
}

fun provideRequestManager(
    application: Application,
    requestOptions: RequestOptions
): RequestManager {
    return Glide.with(application)
        .setDefaultRequestOptions(requestOptions)
}

fun provideRequestOptions(): RequestOptions {
    return RequestOptions()
        .placeholder(R.drawable.loading_animation)
        .error(R.drawable.ic_broken_image)
}

我有一个如下所示的 @BindingAdapter 方法,它创建自己的 RequestManager 实例。现在这个方法位于顶层,它显然没有扩展 KoinComponent,因此我无法访问 by lazy()get() 方法。由于它是一个 @BindingAdapter 方法,因此它必须是顶级的或位于 Object 单例类中,我也没有找到向其中注入(inject)某些内容的方法。

我想改变这个方法:

@BindingAdapter("imageUrl")
fun ImageView.bindImage(imageUrl: String?) {
    imageUrl?.let { url ->
        val parsedImageUrl = url.toUri().buildUpon().scheme("https").build()
        Glide.with(this.context)
            .load(parsedImageUrl)
            .apply(
                RequestOptions()
                    .placeholder(R.drawable.loading_animation)
                    .error(R.drawable.ic_broken_image)
            )
            .into(this)
    }
}

看起来更像这样:

@BindingAdapter("imageUrl")
fun ImageView.bindImage(imageUrl: String?) {
    val injectedGlide: RequestManager by lazy()
    imageUrl?.let { url ->
        val parsedImageUrl = url.toUri().buildUpon().scheme("https").build()
        injectedGlide.load(parsedImageUrl)
            .into(this)
    }
}

现在我的问题是,我对整个情况的处理是否错误?我不应该考虑在 @BindingAdapter 方法中注入(inject)我的 Glide 吗?我还应该遵循其他某种标准吗?这是否与我以错误的方式使用 Koin 有关?

如有任何反馈,我们将不胜感激。

最佳答案

我已经设法找到一种方法让它发挥作用。我不知道这是否是我想要做的事情的正确使用,但至少它让我可以使用我的 Glide 的单个实例。

我现在有一个额外的 Singleton 类

object GlideInstance : KoinComponent {
    val glide: RequestManager by inject()
}

这会在那里注入(inject)RequestManager。由于现在可以从静态方法调用它,因此我的 @BindingAdapter 函数可以像这样简单地调用它

@BindingAdapter("imageUrl")
fun ImageView.bindImage(imageUrl: String?) {
    imageUrl?.let { url ->
        val parsedImageUrl = url.toUri().buildUpon().scheme("https").build()
        GlideInstance.glide
            .load(parsedImageUrl)
            .into(this)
    }
}

我仍然很高兴听到如何做得更好,或者为什么这可能不是一个好方法。

关于android - 如何通过 DI (Koin) 向 @BindingAdapter 方法提供某些内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60763561/

相关文章:

android - 使用两种方式绑定(bind)的可观察字段用法(删除属性更改监听器)

android - Hilt 会取代 Dagger2 吗?

dependency-injection - DDD 中的唯一验证

java - Android数据绑定(bind)问题绑定(bind)适配器调用两次

android - 在数据绑定(bind)中使用键盘上的完成按钮

java - 为什么 Spring 容器在创建 Bean 后立即销毁它们?

java - 将 Locale[] 转换为 CharSequence[] 以放置在 Android 应用程序中的 ListPreference 中

android - 是否可以根据类方法响应有条件地显示 XML 包含内容?

android - 如何从 Android 中的 EditText 字段中删除下划线?

java - mfp WL.Client.createSecurityCheckChallengeHandler() 或 WLAuthorizationManager.login() 中登录失败