升级到 Coil 3.x
Coil 3 是 Coil 的下一个主要版本,包含多项重大改进:
- 完全支持 Compose Multiplatform,包括所有主要目标平台(Android、iOS、JVM、JS 和 WASM)。
- 支持多种网络库(Ktor 和 OkHttp)。或者,如果您只需要加载本地/静态文件,可以在没有网络依赖的情况下使用 Coil。
- 改进了 Compose
@Preview渲染,并通过LocalAsyncImagePreviewHandler支持自定义预览行为。 - 修复了需要破坏现有行为的重要错误(如下文所述)。
本文档提供了从 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。
coil-base 和 coil-compose-base 构件分别重命名为 coil-core 和 coil-compose-core,以符合 Coroutines、Ktor 和 AndroidX 使用的命名约定。
网络图像
coil-core 默认不再支持从网络加载图像。您必须添加对 Coil 网络构件之一的依赖。点击此处查看更多信息。。进行此项更改是为了让使用者可以使用不同的网络库,或者在应用不需要时避免引入网络依赖。
此外,默认情况下不再遵循缓存控制标头。详见此处。
多平台
Coil 3 现在是一个 Kotlin Multiplatform 库,支持 Android、JVM、iOS、macOS、Javascript 和 WASM。
在 Android 上,Coil 使用标准图形类来渲染图像。在非 Android 平台上,Coil 使用 Skiko 渲染图像。Skiko 是包装了 Google 开发的 Skia 图形引擎的一组 Kotlin 绑定。
作为从 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。此外,这些方法已更新为可重启且可跳过 (restartable and skippable),这应该会提高它们的性能。
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 的支持,因为它会阻碍资源缩减 (resource shrinking) 优化。建议直接传递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不支持修改内存缓存键。相反,如果您的 extra 影响内存缓存键,请使用ImageRequest.memoryCacheKeyExtra。 - 许多
ImageRequest.Builder函数已移至扩展函数,以更轻松地支持多平台。
