@@ -7,44 +7,48 @@ import androidx.compose.ui.graphics.FilterQuality
77import androidx.compose.ui.graphics.ImageBitmap
88import androidx.compose.ui.graphics.painter.Painter
99import androidx.compose.ui.layout.ContentScale
10+ import coil3.Bitmap
11+ import coil3.compose.AsyncImagePainter
12+ import coil3.compose.LocalPlatformContext
13+ import coil3.request.ImageRequest
1014
1115@Composable
12- expect fun AsyncImage (
16+ fun LudiAsyncImage (
1317 url : String? ,
1418 contentDescription : String? ,
1519 modifier : Modifier = Modifier ,
1620 placeholder : Painter ? = null,
1721 error : Painter ? = null,
18- onState : ((State ) -> Unit )? = null,
22+ onState : ((AsyncImagePainter . State ) -> Unit )? = null,
1923 contentScale : ContentScale = ContentScale .Fit ,
2024 alignment : Alignment = Alignment .Center ,
2125 customMemoryCacheKey : String? = null,
26+ allowBitmapHardware : Boolean = true,
2227 filterQuality : FilterQuality = FilterQuality .Low
23- )
24-
25- sealed interface State {
26-
27- val painter: Painter ?
28-
29- data object Empty : State {
30- override val painter: Painter ? get() = null
31- }
32-
33- data class Loading (override val painter : Painter ? ) : State
34-
35- data class Success (
36- override val painter : Painter ,
37- val result : SuccessResult
38- ) : State
39-
40- data class Error (
41- override val painter : Painter ? ,
42- val result : ErrorResult
43- ) : State
28+ ) {
29+ val context = LocalPlatformContext .current
30+ coil3.compose.AsyncImage (
31+ model = ImageRequest .Builder (context)
32+ .data(url)
33+ .memoryCacheKey(customMemoryCacheKey)
34+ .platformSpecificConfig(allowBitmapHardware)
35+ .build(),
36+ contentDescription = contentDescription,
37+ transform = { state ->
38+ when (state) {
39+ is AsyncImagePainter .State .Loading -> AsyncImagePainter .State .Loading (painter = placeholder)
40+ is AsyncImagePainter .State .Error -> AsyncImagePainter .State .Error (painter = error, result = state.result)
41+ else -> state
42+ }
43+ },
44+ onState = onState,
45+ contentScale = contentScale,
46+ alignment = alignment,
47+ filterQuality = filterQuality,
48+ modifier = modifier
49+ )
4450}
4551
46- sealed interface ImageResult
47-
48- data class SuccessResult (val bitmap : ImageBitmap ) : ImageResult
52+ expect fun ImageRequest.Builder.platformSpecificConfig (allowHardware : Boolean ): ImageRequest .Builder
4953
50- data class ErrorResult ( val error : Throwable ? ) : ImageResult
54+ expect fun Bitmap. asImageBitmap (): ImageBitmap
0 commit comments