Chris Miller
05/06/2023, 8:44 AM@Composable
fun ImgPreload(url: String, onLoaded: () -> Unit = {}) {
val signal = Semaphore(1, 1)
LaunchedEffect(url) {
val img = Image()
img.onload = {
signal.release()
}
// This will start the load
img.src = url
signal.acquire()
onLoaded()
}
}
Arjan van Wieringen
05/06/2023, 9:10 PMChris Miller
05/07/2023, 10:14 AMArjan van Wieringen
05/07/2023, 11:07 AMChris Miller
05/07/2023, 11:08 AMobject Preloader {
// A cache of preloaded images. We never look in this cache, it's just here to prevent
// the browser from garbage collecting the most recent preloads.
private const val IMG_CACHE_SIZE = 10
private var imgCacheIndex = 0
private val imgCache = arrayOfNulls<Image>(IMG_CACHE_SIZE)
fun imgPreload(url: String, onLoaded: (Event) -> Unit = {}) {
val img = Image()
imgCache[imgCacheIndex] = img
imgCacheIndex = (imgCacheIndex + 1) % IMG_CACHE_SIZE
img.onload = { event ->
onLoaded(event)
}
// This will start the load
img.src = url
}
}