18.1 LaunchedEffect a rememberCoroutineScope

Táto téma sa venuje Side efektom, konkrétne LaunchedEffect-u a rememberCoroutineScope-u. Oficiálny návod ku všetkým Side efektom nájdeš na oficiálnej stránke.

Side efekt v kontexte JetPack Compose je akákoľvek zmena stavu, ktorá sa vykoná mimo scope Composable funkcie. Teda ak zmeníme MutableState z nie Composable funkcie. Side efekty sú vo všeobecnosti nie odporúčané, ale bývajú nevyhnutné.

LaunchedEffect

LaunchedEffect je Composable funkcia, ale jej telo je neComposable suspend funkcia, ktorá sa spustí vždy, keď sa zmení hodnota nejakého kľúča, ktorý tiež vstupuje do LaunchedEffect-u. Veľmi často ju používame, keď chceme vykonať nejakú akciu hneď pri zobrazení našej Composable funkcie:

@Composable
fun DashboardScreen() {
    LaunchedEffect(Unit) {
        Log.d("My App", "DashboardScreen displayed")
    }
    
    Text("Dashboard")
}

Hodnota Unit sa nikdy nezmení, preto sa LaunchedEffect vykoná iba raz pri zobrazení DashboardScreen.

Pozor! Keď DashboardScreen opustí kompozíciiu (napríklad back navigáciou), stratí svoj stav. Po znovuzobrazení sa tak LaunchedEffect zavolá znova.

Ďalší zaujímavý use-case je, reálne reagovať na zmeny v MutableState-e. Napríklad, ak chceme (približne) implementovať stopky, môžeme použiť LaunchedEffect takto:

@Composable
fun StopWatch() {
    
    var seconds by remember { mutableStateOf(0) }
    
    LaunchedEffect(seconds) {
        delay(1.seconds)
        seconds++
    }

    Text("$seconds")
}

Po zobrazení StopWatch:

  1. spustí sa LaunchedEffect, pretože kľúč (seconds) sa “zmenil”
  2. vykoná sa v ňom približne 1-sekundový delay
  3. seconds sa inkrementuje o 1
  4. kľúč (seconds) sa znova zmenil, preto sa LaunchedEffect znova vykoná - pokračuj bodom 2

rememberCoroutineScope

Túto funkciu sme si už ukazovali. Jej úlohou je získať CoroutineScope naviazaný na životný cyklus aktuálnej Composable funkcie. Akonáhle táto Composable funkcia opustí kompozíciu, CoroutineScope sa zruší. Preto sa táto funkcia môže hodiť ak potrebujeme v UI vykonávať nenáročné operácie na pozadí.