Compose ImageLoader

Compose Image library for Kotlin Multiplatform.
Setup
Add the dependency in your common module's commonMain sourceSet
kotlin {
android()
ios()
// ...
sourceSets {
val commonMain by getting {
dependencies {
+ api("io.github.qdsfdhvh:image-loader:1.10.0")
// optional - Compose Multiplatform Resources Decoder
+ api("io.github.qdsfdhvh:image-loader-extension-compose-resources:1.10.0")
// optional - Moko Resources Decoder
+ api("io.github.qdsfdhvh:image-loader-extension-moko-resources:1.10.0")
// optional - Blur Interceptor (only support bitmap)
+ api("io.github.qdsfdhvh:image-loader-extension-blur:1.10.0")
}
}
val jvmMain by getting {
dependencies {
// optional - ImageIO Decoder
+ api("io.github.qdsfdhvh:image-loader-extension-imageio:1.10.0")
}
}
}
}
How to Use
Display Image
val painter = rememberImagePainter("https://..")
Image(
painter = painter,
contentDescription = "image",
)
PS: default Imageloader will reload when it's displayed, is not friendly for https link, so it is recommended to custom ImageLoader and configure the cache.
Custom ImageLoader
I configure the Imageloader {} on each platform, you also can configure it in the commonMain like Tachidesk-JUI.
@Composable
fun Content() {
CompositionLocalProvider(
LocalImageLoader provides remember { generateImageLoader() },
) {
AutoSizeImage(
,
contentDescription = ,
)
AutoSizeBox() { action ->
(action) {
ImageAction.Success -> {
Image(
rememberImageSuccessPainter(action),
contentDescription = ,
)
}
ImageAction.Loading -> {}
ImageAction.Failure -> {}
}
}
Image(
painter = rememberImagePainter(),
contentDescription = ,
)
}
}
Use priority: AutoSizeImage -> AutoSizeBox -> rememberImagePainter.
AutoSizeBox & AutoSizeImage are based on Modifier.Node, AutoSizeImage ≈ AutoSizeBox + Painter.
in Android
fun generateImageLoader(): ImageLoader {
return ImageLoader {
options {
androidContext(applicationContext)
}
components {
setupDefaultComponents(context)
}
interceptor {
bitmapMemoryCacheConfig {
maxSizePercent(context, )
}
imageMemoryCacheConfig {
maxSize()
}
painterMemoryCacheConfig {
maxSize()
}
diskCacheConfig {
directory(context.cacheDir.resolve().toOkioPath())
maxSizeBytes( * * )
}
}
}
}
in Jvm
in iOS
for more platform targets, see app.
ImageRequest
val imageRequest = ImageRequest {
data(url)
addInterceptor(DoSomthingInterceptor())
components {
}
extra {
set("key_int", 11)
}
}
val newImageRequest = ImageRequest(imageRequest) {
}
Before 1.2.8
LocalImageLoader has no default value, you must be configured on each platform, and configuration is similar to coil.
@Composable
fun Content() {
CompositionLocalProvider(
LocalImageLoader provides remember { generateImageLoader() },
) {
val painter = rememberAsyncImagePainter("https://.....")
Image(
painter = painter,
contentDescription = "image",
)
}
}
fun generateImageLoader(): ImageLoader {
return ImageLoaderBuilder().build()
}
Thx
Coil