En Jetpack compose, tenemos la opción de usar rememberCoroutineScope()
así como usar el Composable LaunchedEffect
para usar corrutinas/ejecutar funciones de suspensión (mostrar snackbars, etc.).
La convención que he adoptado hasta ahora es recordar un solo ámbito de rutina en la parte superior de mi árbol de composición y pasarlo a través de argumentos de función a los lugares donde se necesita. Esto parece vagamente una buena práctica, pero por otro lado está agregando ruido adicional a las firmas de mi función.
LaunchedEffect
en lugar de rememberCoroutineScope()
dentro de las funciones componibles?rememberCoroutineScope()
en cada función donde se inicia realmente una corrutina?Use RememberCoroutineScope() cuando esté usando corrutinas y necesite cancelar y reiniciar la corrutina después de un evento.
Use LaunchedEffect() cuando esté usando rutinas y necesite cancelar y reiniciar la rutina cada vez que cambie su parámetro y no esté almacenado en un estado mutable.
Dejando mi entendimiento aquí:
Pregunta 1: LaunchedEffect
debe usarse cuando desea que se realice alguna acción cuando se inicia su componible por primera vez. Por ejemplo, cuando desea solicitar algunos datos de su ViewModel o ejecutar algún tipo de animación...
rememberCoroutineScope
, por otro lado, es específico para almacenar el alcance de Coroutine, lo que permite que el código inicie alguna función de suspend
... en mi humilde opinión, la única relación entre ellos es que también puede usar un LaunchedEffect
para iniciar una coroutine...
Pregunta 2: Como puedes ver en los documentos, rememberCoroutineScope
mantendrá la referencia del alcance de la rutina en un punto específico de la composición. Por lo tanto, si un componible determinado se elimina de la recomposición, esa corrutina se cancelará automáticamente. Por ejemplo, tiene las siguientes llamadas componibles A -> B -> C
. Si recuerda el alcance de la rutina en C
y se elimina de la composición, la rutina se cancela automáticamente. Pero si recuerda de A
, pase el alcance a través de B
y C
, use este alcance en C
, y luego se elimina C
, la rutina continuará ejecutándose (porque se recordó en A
) ...