Tengo un buscapersonas (acompañante) con una imagen que se obtiene de la web con Coil en Compose.
El rememberPainter() parece que solo llama a la solicitud cuando la Image componible se muestra por primera vez.
Entonces, cuando deslizo la página en el buscapersonas, la Image se muestra solo en ese momento, por lo que tenemos que esperar un momento.
¿Alguna forma de forzar la precarga de rememberPainter (Bobina)?
Edición 1:
Aquí hay una versión simple de mi implementación (con muchas cosas eliminadas pero que no tuvieron impacto en el resultado):
@Composable private fun Foo(imageList: List<ImageHolder>) { if (imageList.isEmpty()) return val painterList = imageList.map { rememberImagePainter( data = it.getDataForPainter(), builder = { crossfade(true) }) } ImageLayout(imageList, painterList) } @Composable fun ImageLayout(imageList: List<ImageHolder>, painterList: List<Painter>) { HorizontalPager( count = imageList.size, modifier = Modifier.fillMaxWidth(), ) { page -> Image( painter = painterList[page], "", modifier = Modifier .fillMaxWidth() .height(200.dp) .background( imageList[page].colorAverage ), contentScale = ContentScale.Crop ) } }Intenté tener directamente el RememberImagePainter en la imagen también por si acaso. Pero el problema es claramente que Image() de la página 2, 3, 4 no se procesa, por lo que Image no llama al pintor. Traté de ver cómo funciona por dentro, pero no pude encontrar.
Edición 2: encontré una solución pero no está limpia
for (painter in painterList) Image(painter = painter, contentDescription = "", modifier = Modifier.size(0.001.dp)) Obliga a la bobina a cargar la imagen y con un tamaño realmente pequeño como 0.001.dp (con 0 no carga). Además, el problema es que en el generador debe forzar un tamaño o solo cargará un píxel, por lo que fuerzo el tamaño completo de la imagen porque no sé qué tamaño habría estado disponible para la imagen.
En la documentación de Coil hay una sección sobre precarga. Dependiendo de su arquitectura, puede hacer esto en diferentes lugares, el más fácil es usar LaunchedEffect :
val context = LocalContext.current val imageLoader = LocalImageLoader.current LaunchedEffect(Unit) { val request = ImageRequest.Builder(context) .data("https://www.example.com/image.jpg") // Optional, but setting a ViewSizeResolver will conserve memory by limiting the size the image should be preloaded into memory at. // For example you can set static size, or size resolved with Modifier.onSizeChanged // .size(coil.size.PixelSize(width = 100, height = 100)) // or resolve display size if your images are full screen // .size(DisplaySizeResolver(context)) .build() imageLoader.enqueue(request) }