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