Jetpack Compose 使用 Coil 加载图片

Compose 版本:1.0.0-beta08

Accompanist 版本:0.11.1

添加依赖

//Accompanist
val accompanistVersion = "0.11.1"
implementation("com.google.accompanist:accompanist-coil:$accompanistVersion")
//需加载 gif,可添加此依赖
implementation("io.coil-kt:coil-gif:1.2.1")

权限

<uses-permission android:name="android.permission.INTERNET"/>

Application 配置

class MyApplication : Application(), ImageLoaderFactory {

    companion object {
        @SuppressLint("StaticFieldLeak")
        lateinit var context: Context
    }

    override fun onCreate() {
        super.onCreate()
        context = applicationContext
    }

    override fun newImageLoader(): ImageLoader {
        return ImageLoader.Builder(context)
            .componentRegistry {
                // gif
                if (SDK_INT >= Build.VERSION_CODES.P) {
                    add(ImageDecoderDecoder(context))
                } else {
                    add(GifDecoder())
                }
            }
            .allowHardware(false)
            .diskCachePolicy(CachePolicy.ENABLED)
            .memoryCachePolicy(CachePolicy.ENABLED)
            .networkCachePolicy(CachePolicy.ENABLED)
            .availableMemoryPercentage(0.5)
            .okHttpClient {
                // 自定义 client
                OkHttpClient.Builder()
                    .retryOnConnectionFailure(true)
                    .connectTimeout(10, TimeUnit.SECONDS)
                    .writeTimeout(10, TimeUnit.SECONDS)
                    .readTimeout(10, TimeUnit.SECONDS)
                    .build()
            }
            .build()
    }

}

使用

@Composable
fun LoadImage(url: String) {
    val painter = rememberCoilPainter(request = url)

    Image(
        painter = when (painter.loadState) {
            is ImageLoadState.Success -> painter
            is ImageLoadState.Loading -> rememberCoilPainter(request = R.drawable.ic_launcher_foreground)
            else -> rememberCoilPainter(request = R.drawable.ic_launcher_background)
        }, contentDescription = null
    )
}