Android. Kotlin. Существует проблема с загрузкой изображений через Glide (placeholder) и переключением на тёмную тему или на светлую тему. Шаги воспроизведения:
      загрузить плейсхолдер хотя бы 1 раз (т.е. увидеть его)
      переключить тему
      плейсхолдер не переключится на другую тему
До конца сессии МП плейсхолдер останется в изначальной теме.
Причина: метод загрузки изображений кеширует изображения для плейсхолдера и ошибки загрузки. Вот что предлагает один из разработчиков. У нас есть файлик GlideDrawablesCache.kt
В нём лежит val drawablesCache, в котором сохраняются уже загруженные изображения. Сейчас ключом для хранения выступает идентификатор ресурса
Выходит, что в этот кеш по идентификатору сохранится изображение в том виде, с темой которого оно изначально было загружено
Предложение было: расширить ключ хранилища, добавить к нему светлую/тёмную тему. Выходит, нужно при загрузке изображения в методе getDrawableCacheRequest понимать какая тема сейчас применена. У нас там есть доступ к Context, так что по идее из него можно вытащить эту информацию (context.isApplicationInNightMode)
Альтернативное предложение: не расширять ключ, а добавить отдельные val ...CacheLightTheme|DarkTheme, но суть в целом остаётся та же. package ru.maxi.mobile.common.utils.android.glide

import android.content.Context
import android.graphics.drawable.Drawable
import androidx.annotation.DrawableRes
import androidx.core.content.ContextCompat
import com.bumptech.glide.RequestBuilder
import com.bumptech.glide.request.RequestOptions

/**
 * Установить значение [RequestBuilder.thumbnail] по идентификатору ресурса [resId]
 *
 * Drawable для thumbnail'а кешируется и переиспользуется между другими вызовами [withCachedThumbnail]
 *
 * @param context контекст для доступа к ресурсам приложения
 * @param options настройки отображения изображения
 */
fun <R : Drawable> RequestBuilder<R>.withCachedThumbnail(
    context: Context,
    @DrawableRes resId: Int?,
    options: RequestOptions = RequestOptions(),
): RequestBuilder<R> {
    val thumbnailRequest = resId?.let { getDrawableCacheRequest(context, it, options) }
    return this.thumbnail(thumbnailRequest)
}

/**
 * Установить значение [RequestBuilder.error] по идентификатору ресурса [resId]
 *
 * Drawable для error'а кешируется и переиспользуется между другими вызовами [withCachedError]
 *
 * @param context контекст для доступа к ресурсам приложения
 * @param options настройки отображения изображения
 */
fun <R : Drawable> RequestBuilder<R>.withCachedError(
    context: Context,
    @DrawableRes resId: Int?,
    options: RequestOptions = RequestOptions(),
): RequestBuilder<R> {
    val errorRequest = resId?.let { getDrawableCacheRequest(context, it, options) }
    return this.error(errorRequest)
}

private val drawablesCache = mutableMapOf<Int, Drawable>()

private fun <R : Drawable> RequestBuilder<R>.getDrawableCacheRequest(
    context: Context,
    @DrawableRes drawableResId: Int,
    options: RequestOptions = RequestOptions(),
): RequestBuilder<R>? {
    val drawable = drawablesCache[drawableResId]
        ?: ContextCompat.getDrawable(context, drawableResId)?.also {
            drawablesCache[drawableResId] = it
        }
    return drawable?.let { this.clone().load(it).apply(options) }
}
Твои мысли по этому поводу, что можно исправить предложи.