如何通过 DI (Koin) 向 @BindingAdapter 方法提供一些东西?

How to provide something through DI (Koin) to a @BindingAdapter method?

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

我想以某种方式为我的@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 方法,所以它必须是顶层的或者在一个对象单例中 class,我也没有找到一种方法来向其中注入一些东西。

我想改变这个方法:

@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 方法中注入我的 Glide 吗?我应该遵循其他某种标准吗?这是否与我使用 Koin 的方式不正确有关?

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

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

我现在多了一个单例class

object GlideInstance : KoinComponent {
    val glide: RequestManager by 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)
    }
}

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

我找到了另一种方法:

object BindingAdaptersManager : KoinComponent {

    private val imageLoader: ImageLoader by inject(ImageLoader::class.java)

    @JvmStatic
    @BindingAdapter("imageFromUrl")
    fun bindImageFromUrl(view: ImageView, imageUrl: String?) {
        imageLoader.loadImageUrl(view, imageUrl)
    }
}

ImageLoader 使用 Glide 加载图片