如果通过其他方式可以更轻松地解决这个问题,我会很高兴听到,但现在就是这样。
我想以某种方式为我的 @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/