Efectos secundarios de Jetpack Compose III: recuerde Estado actualizado | Autor: Udit Verma | Septiembre de 2021
En los dos primeros artículos, aprendimos cómo iniciar nuevos efectos secundarios y qué escenarios son más adecuados. LaunchedEffect
en comparación con rememberCoroutineScope
viceversa.
En este artículo, veremos rememberUpdatedState
Esta es otra api relacionada con los efectos secundarios, aunque no provoca nuevos efectos secundarios como vimos antes.
rememberUpdatedState
Se usa cuando queremos mantener las referencias actualizadas a las variables en los efectos secundarios de larga duración y no reiniciar en la recombinación.
La declaración anterior puede ser confusa, así que intentemos desglosarla.
Supongamos que tenemos un efecto secundario de larga duración, incluso si la composición se recombina, no se reiniciará. En el siguiente ejemplo, tenemos un temporizador que se inicia tan pronto como el elemento combinable aparece en la pantalla y finaliza después de 5 segundos.Preste atención al hecho de que hemos utilizado Unit
(Un valor constante que nunca cambia) como parámetro key1
existe LaunchedEffect
De esta manera, incluso si se recombina el componente principal, este efecto secundario no volverá a comenzar. Usaremos este concepto en los siguientes ejemplos.
Hasta aquí todo bien.Ahora queremos acceder a una variable en este LaunchedEffect
Bloquear cuando expire el temporizador. Podemos suponer que esta variable se pasa como un parámetro del padre componible a este componible.
En el siguiente ejemplo, tenemos una pantalla con 2 botones de diferentes colores: un botón rojo y un botón negro. Además, tenemos un temporizador (invisible) que comienza inmediatamente después del dibujo componible y toma esta variable de color como entrada. Cuando el temporizador expira, queremos imprimir el color del último botón presionado por el usuario en la consola.
Cada vez que se presione el botón, actualizaremos la variable de estado con el último valor de color, que también activará una recombinación Timer
Puede combinarse.Cuando se acaba el temporizador, imprimimos buttonColour
Cambiando.
Veamos el funcionamiento de este código en el siguiente video
En el video de arriba, incluso si el usuario hace clic en el botón varias veces, el valor del color se imprime como desconocido. ¿Por qué está pasando esto?Esto es porque cuando LaunchedEffect
El bloque comienza a ejecutarse y el valor de la variable de color se establece en desconocido luego.Más tarde, cuando el usuario hace clic en el botón, incluso Timer
La composición se puede combinar con un nuevo valor de color, LaunchedEffect
El bloque no se reinició (key1
sí Unit
).Por tanto, el valor buttonColour
Las variables de este bloque nunca se actualizan.
Esta es una situación en la que rememberUpdatedState
Ven a salvarnos.Nosotros podemos usar rememberUpdatedState
Envuelva esta variable de color en un objeto de estado, el objeto siempre mantendrá el último valor Timer
Combinable.En el siguiente ejemplo, no hacemos referencia directamente a la variable de color, sino que primero la envolvemos en rememberUpdatedState
Y usa la instancia internamente LaunchedEffect
Obstruido.
Como era de esperar, esta nueva variable de estado ahora contiene el valor actualizado del color.Espero que ahora la declaración que vimos arriba defina rememberUpdatedState
más significativo. Reiterar:
rememberUpdatedState
Se usa cuando queremos mantener las referencias actualizadas a las variables en los efectos secundarios de larga duración y no reiniciar en la recombinación.