Compose Multiplatform 之旅 — 图标、图片展示(coil)

在app 开发过程中,本地图标展示和网络图片加载都是必不可少的,那Compose Multiplatform项目中,是如何展示本地图标和加载网络图片的呢?

想了解更多Compose Multiplatform项目的小伙伴,可以看看之前的文章

本地图标展示

1.将图片移到资源路径下

在commonMain->composeResources->drawable 放入你的本地图片

2.执行一下Build->Make Project

生成对应的代码,其他地方能够引用到。如果你添加了资源,但是没有对应的drawable ,就需要执行一下这个操作

3.使用对应的drawable

直接通过生成的资源类,就可以引用到本地的图标了。

ini 复制代码
Image(  
    painter = painterResource(Res.drawable.dog),  
    contentDescription = "小狗"  
)

网络图片加载

对于框架的选择,我们还是使用之前推荐的 klibs.io ,搜image 关键字,找到了一个破万star的开源项目coil。全 Kotlin 实现,API 也更简洁。

仓库地址:github.com/coil-kt/coi...

依赖引入

在commonMain 模块引入依赖。注意这里使用的网络库是ktor,所以也引入了 coil-network-ktor3,另外ktor 的版本和coil 是有一个对应关系,我之前用的是低版本的ktor , coil 图片就加载不出来。

scss 复制代码
commonMain.dependencies {  
  
    implementation("io.coil-kt.coil3:coil-compose:3.0.4")  
    implementation("io.coil-kt.coil3:coil-network-ktor3:3.0.4")  
}

图片加载

通过AsyncImage,设置model = ${url} 就可以加载图片了。

less 复制代码
@Composable  
fun ImageGrid() {   
    val imageUrls = listOf(  
        "https://picsum.photos/300/300?random=1",  
        "https://picsum.photos/300/300?random=2",  
        "https://picsum.photos/300/300?random=3",  
        "https://picsum.photos/300/300?random=4",  
        "https://picsum.photos/300/300?random=5",  
        "https://picsum.photos/300/300?random=6",  
        "https://picsum.photos/300/300?random=7",  
        "https://picsum.photos/300/300?random=8",  
        "https://picsum.photos/300/300?random=9"  
    )  
  
    LazyVerticalGrid(  
        columns = GridCells.Fixed(3), 
        modifier = Modifier.fillMaxSize(),  
        state = rememberLazyGridState(),  
        verticalArrangement = Arrangement.spacedBy(4.dp),  
        horizontalArrangement = Arrangement.spacedBy(4.dp)  
    ) {  
        items(imageUrls) { url ->  
            AsyncImage(  
                model = url,  
                contentDescription = null,  
                modifier = Modifier  
                    .aspectRatio(1f)   
                    .padding(4.dp)  
                    .background(Color.Gray),  
                contentScale = ContentScale.Crop   
			)  
        }  
    }
}

展示效果

回调监听

可以通过onSuccess,onError,onLoading获取到图片加载过程中的回调。我之前因为ktor 低版本加载不出来,排查问题就是通过onError发现了不能加载的原因。通过升级ktor 版本号到3.0.0解决了该问题。

ini 复制代码
AsyncImage(  
    model = "https://picsum.photos/300/300",  
    contentDescription = null,  
    modifier = Modifier  
        .aspectRatio(1f) // 保持正方形  
        .padding(4.dp)  
        .background(Color.Blue),  
    onSuccess = { result ->  
        println("图片加载成功")  
    },  
    onError = { result ->  
        println("错误原因: ${result}")  
    },  
    onLoading = {  
        println("图片加载中...")  
    },  
    contentScale = ContentScale.Crop // 图片裁剪填充  
)

结语

目前app开发大部分场景的问题也都介绍了,有想了解compose multiplatform 什么特性的,可以提出来,我们一起学习,共同进步。后续也会用一些实战项目,结合之前提到的一些东西,继续探索compose multiplatform 。

相关推荐
沐怡旸3 小时前
【底层机制】垃圾回收(GC)底层原理深度解析
android·面试
whatever who cares3 小时前
android/java中gson的用法
android·java·开发语言
用户0273851840263 小时前
【Android】活动的正/异常生命周期和启动模式、标志位详解
android
nono牛5 小时前
MTK平台详解`adb devices`输出的序列号组成
android·linux·adb·智能手机
zhangphil5 小时前
Android通过SQL查询trace分析进程启动线程总数量
android
下位子5 小时前
『OpenGL学习滤镜相机』- Day3: 着色器基础 - GLSL 语言
android·opengl
bqliang5 小时前
Jetpack Navigation 3:领航未来
android·android studio·android jetpack
云存储小天使5 小时前
安卓蛙、苹果蛙为什么难互通?
android
陈大头铃儿响叮当8 小时前
Android Studio升级后,Flutter运行android设备报错
android·flutter·android studio
勤劳打代码8 小时前
isar_flutter_libs 引发 Namespace not specified
android·flutter·groovy