升级到 Coil 3.x
Coil 3 是 Coil 的下一个主要版本,它包含了多项重大改进:
- 全面支持 Compose Multiplatform,包括所有主要目标平台(Android、iOS、JVM、JS 和 WASM)。
- 支持多种网络库(Ktor 和 OkHttp)。或者,如果您只需要加载本地/静态文件,Coil 也可以在没有网络依赖的情况下使用。
- 改进了 Compose
@Preview渲染,并通过LocalAsyncImagePreviewHandler支持自定义预览行为。 - 针对需要破坏现有行为的 bug 进行了重要修复(如下所述)。
本文档提供了从 Coil 2 到 Coil 3 的主要变化概览,并重点介绍了所有破坏性或重要更改。它不涵盖每一个二进制不兼容的更改或小的行为变化。
在 Compose Multiplatform 项目中使用 Coil 3?请查看 samples 仓库以获取示例。
Maven 坐标和包名
Coil 的 Maven 坐标已从 io.coil-kt 更新为 io.coil-kt.coil3,其包名已从 coil 更新为 coil3。这使得 Coil 3 可以与 Coil 2 并行运行,而不会出现二进制兼容性问题。例如,io.coil-kt:coil:2.7.0 现在是 io.coil-kt.coil3:coil:3.0.0。
为了与 Coroutines、Ktor 和 AndroidX 使用的命名约定保持一致,coil-base 和 coil-compose-base 工件已分别重命名为 coil-core 和 coil-compose-core。
网络图片
coil-core 不再默认支持从网络加载图片。 您必须添加对 Coil 某个网络工件的依赖。详见此处。。进行此更改是为了让消费者可以使用不同的网络库,或者在应用不需要时避免网络依赖。
此外,缓存控制标头不再默认受尊重。详见 此处。
多平台
Coil 3 现在是一个 Kotlin 多平台库,支持 Android、JVM、iOS、macOS、Javascript 和 WASM。
在 Android 上,Coil 使用标准图形类来渲染图片。在非 Android 平台上,Coil 使用 Skiko 来渲染图片。Skiko 是 JetBrains 开发的一组 Kotlin 绑定,它封装了由 Google 开发的 Skia 图形引擎。
作为与 Android SDK 解耦的一部分,进行了一些 API 更改。值得注意的是:
Drawable被自定义的Image接口取代。在 Android 上,使用Drawable.asImage()和Image.asDrawable(resources)在这些类之间进行转换。在非 Android 平台上,使用Bitmap.asImage()和Image.toBitmap()。- Android 的
android.net.Uri类用法被多平台coil3.Uri类取代。任何将android.net.Uri作为ImageRequest.data传递的调用点不受影响。依赖于接收android.net.Uri的自定义Fetcher需要更新为使用coil3.Uri。 Context的用法被PlatformContext取代。PlatformContext在 Android 上是Context的类型别名,在非 Android 平台上可以使用PlatformContext.INSTANCE访问。在 Compose Multiplatform 中,使用LocalPlatformContext.current获取引用。Coil类被重命名为SingletonImageLoader。- 如果您在自定义的 Android
Application类中实现了ImageLoaderFactory,则需要切换为实现SingletonImageLoader.Factory来替代ImageLoaderFactory。一旦您实现了SingletonImageLoader.Factory,如果需要或希望覆盖newImageLoader(),您就可以这么做。
多平台支持 coil-svg 工件,但 coil-gif 和 coil-video 工件目前仍仅限 Android 使用,因为它们依赖于特定的 Android 解码器和库。
Compose
coil-compose 工件的 API 大部分未变。您可以继续像 Coil 2 一样使用 AsyncImage、SubcomposeAsyncImage 和 rememberAsyncImagePainter。此外,这些方法已更新为 可重启和可跳过,这应该会提高它们的性能。
AsyncImagePainter.state现在是一个StateFlow。应该使用val state = painter.state.collectAsState()来观察它。AsyncImagePainter的默认SizeResolver不再等待第一次onDraw调用来获取画布的大小。相反,AsyncImagePainter默认使用Size.ORIGINAL。- Compose 的
modelEqualityDelegate委托现在通过一个组合本地LocalAsyncImageModelEqualityDelegate设置,而不是作为AsyncImage/SubcomposeAsyncImage/rememberAsyncImagePainter的参数。
通用
其他重要的行为更改包括:
- 第一方
Fetcher和Decoder(例如NetworkFetcher.Factory、SvgDecoder等)现在通过服务加载器自动添加到每个新的ImageLoader中。此行为可以通过ImageLoader.Builder.serviceLoaderEnabled(false)禁用。 - 移除对
android.resource://example.package.name/drawable/imageURI 的支持,因为它会阻止资源缩小优化。建议直接传递R.drawable.image值。传递资源 ID 而不是资源名称仍然有效:android.resource://example.package.name/12345678。如果您仍然需要其功能,可以 手动将ResourceUriMapper包含在您的组件注册表中。 - 文件的最后写入时间戳不再默认添加到其缓存键中。这是为了避免在主线程上读取磁盘(即使时间很短)。可以通过
ImageRequest.Builder.addLastModifiedToFileCacheKey(true)或ImageLoader.Builder.addLastModifiedToFileCacheKey(true)重新启用此功能。 - 输出图片尺寸现在被强制限制在 4096x4096 以下,以防止意外的内存溢出 (OOM)。这可以通过
ImageLoader/ImageRequest.Builder.maxBitmapSize配置。要禁用此行为,请将maxBitmapSize设置为Size.ORIGINAL。 - Coil 2 的
ParametersAPI 已被Extras取代。Extras不需要字符串键,而是依赖于身份相等性。Extras不支持修改内存缓存键。相反,如果您的额外参数影响内存缓存键,请使用ImageRequest.memoryCacheKeyExtra。 - 许多
ImageRequest.Builder函数已移至扩展函数,以更方便地支持多平台。
