使用Coil + Jetpack Compose + Kotlin加载网络视频缩略图时遇函数调用错误求助
使用Coil + Jetpack Compose + Kotlin加载网络视频缩略图时遇函数调用错误求助
嘿,我一眼就揪出问题根源啦——你这是混用了Coil不同大版本的依赖,导致API不兼容才触发的函数调用错误,咱们一步步来搞定它:
问题核心
你同时引入了Coil 2.x版本的coil-compose(2.5.0)和Coil 3.x版本的coil-video(3.0.3),这两个大版本的API结构差异很大:不仅包命名规则变了,组件注册的方法参数要求也不一样,所以add(VideoFrameDecoder.Factory())才会弹出“没有可用的匹配函数”的错误提示。
解决方案:统一Coil版本
你有两个可选方案,选其中一种执行即可:
方案1:升级到Coil 3.x(推荐,新版本功能更完善)
先把依赖全部换成统一的Coil 3.x版本,注意Coil 3的coil-compose依赖路径和2.x不一样:
implementation("io.coil-kt.coil3:coil-compose:3.0.3") implementation("io.coil-kt.coil3:coil-video:3.0.3")
然后调整ImageLoader的构建代码,对齐Coil 3的API(包导入路径也要更新):
import coil3.ImageLoader import coil3.video.VideoFrameDecoder import coil3.compose.setSingletonImageLoader val videoEnabledLoader = ImageLoader.Builder(context) .components { add(VideoFrameDecoder.Factory()) } .build() // 在Compose环境中,记得设置全局或局部的ImageLoader setSingletonImageLoader(videoEnabledLoader)
方案2:降级到统一的Coil 2.x版本
如果暂时不想升级大版本,就把coil-video换成和coil-compose同版本的2.5.0:
implementation("io.coil-kt:coil-compose:2.5.0") implementation("io.coil-kt:coil-video:2.5.0")
对应的ImageLoader代码可以保留你原本的写法(包导入用2.x的路径):
import coil.ImageLoader import coil.video.VideoFrameDecoder val videoEnabledLoader = ImageLoader.Builder(context) .components { add(VideoFrameDecoder.Factory()) } .build()
只要把依赖版本统一,这个函数调用错误应该就会消失,之后就能正常加载网络视频的缩略图了。
备注:内容来源于stack exchange,提问作者Ernest Muhumuza




