升級至 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 網路構件之一的相依性。請參閱此處了解更多資訊。。進行此項更改是為了讓使用者可以使用不同的網路程式庫,或者如果他們的應用程式不需要網路,則可以避免網路相依性。
此外,預設不再遵循快取控制標頭。請參閱此處了解更多資訊。
Multiplatform
Coil 3 現在是一個 Kotlin Multiplatform 程式庫,支援 Android、JVM、iOS、macOS、Javascript 和 WASM。
在 Android 上,Coil 使用標準圖形類別來渲染圖片。在非 Android 平台上,Coil 使用 Skiko 來渲染圖片。Skiko 是一組 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委派現在透過 composition localLocalAsyncImageModelEqualityDelegate設定,而不是作為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不支援修改記憶體快取金鑰。相反地,如果您的 extra 會影響記憶體快取金鑰,請使用ImageRequest.memoryCacheKeyExtra。 - 許多
ImageRequest.Builder函式已改為擴充函式,以便更輕鬆地支援多平台。
