Как обеспечить что-то через DI (Koin) для метода @BindingAdapter? - PullRequest
1 голос
/ 19 марта 2020

Если бы это было легче решить каким-либо другим способом, я был бы рад услышать это, но здесь это идет.

Я хочу каким-то образом предоставить моему методу @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, который я также не нашел способа вставить что-то туда.

Я хотел бы изменить этот метод:

@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? Есть ли какой-то другой стандарт, которому я должен следовать? Это просто связано со мной, если я использую Коин неправильно?

Буду признателен за любые отзывы.

1 Ответ

1 голос
/ 20 марта 2020

Мне удалось найти один способ заставить его работать. Я не знаю, является ли это правильным использованием того, что я пытаюсь сделать, но по крайней мере это позволяет мне использовать мой единственный экземпляр Glide.

У меня теперь есть дополнительный класс Singleton

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

Это вводит RequestManager туда. И поскольку теперь его можно вызывать из метода stati c, моя функция @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)
    }
}

Я был бы рад услышать, как это можно сделать лучше или почему это не может быть хорошим подходом.

...