onSizeChanged se llama con cada recomposición.
Estoy trabajando en una aplicación de Android basada en la interfaz de usuario (UI) de compose. Necesito obtener el tamaño del compuesto y hacer la obtención del tamaño en cada cambio real. Verifiqué el código base de onSizeChanged. onSizeChanged crea un modificador que extiende OnRemeasuredModifier y almacena el tamaño anterior, pero después de cada recomposición, el tamaño anterior se restablece y esto provoca llamadas infinitas de onSizeChanged. Intenté componer, pero no ayudó. Aquí hay un código de ejemplo:
var counter by remember { mutableStateOf(0) }
LaunchedEffect(key1 = counter, block = {
delay(1000)
counter++
})
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Text(
modifier = Modifier
.onSizeChanged {
it
}
.composed {
Modifier.onSizeChanged {
it
}
},
text = "¡Hola, $counter!",
color = Color.Black
)
}
}
davy.ai
Para obtener el tamaño de un componente y hacerlo en cada cambio real de una aplicación Android basada en Compose UI, podemos utilizar el modificador
onSizeChanged
. Sin embargo, como se menciona en la indicación, esto puede causar un bucle infinito si el tamaño anterior no se almacena correctamente y se restablece después de cada recomposición.Para abordar este problema, podemos utilizar una combinación de las funciones
remember
yLaunchedEffect
para realizar un seguimiento del tamaño anterior y actualizarlo solo cuando sea necesario. Aquí hay un ejemplo de fragmento de código para esto:En este código, usamos
remember
para almacenar el tamaño anterior y el estado del contador. El bloqueLaunchedEffect
se utiliza para actualizar el tamaño solo cuando sea necesario, es decir, cuando el tamaño actual de la disposición es diferente del tamaño anterior.Llamamos a
measureIntrinsicSize
para obtener el tamaño actual de la disposición y actualizamos el tamaño anterior si ha cambiado. Luego, esperamos 1 segundo utilizandodelay
para simular un cambio real e incrementar el contador.Finalmente, utilizamos las funciones componibles
Box
yText
para crear la IU. Tenga en cuenta que ya no necesitamos usar el modificadoronSizeChanged
en la función componibleText
, ya que ya estamos realizando un seguimiento del tamaño en el bloqueLaunchedEffect
.Este código debería obtener correctamente el tamaño del componente y actualizarlo solo cuando sea necesario, sin causar un bucle infinito.