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 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ď
DashboardScreenopustí kompozíciiu (napríklad back navigáciou), stratí svoj stav. Po znovuzobrazení sa takLaunchedEffectzavolá 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:
LaunchedEffect, pretože kľúč (seconds) sa “zmenil”delayseconds sa inkrementuje o 1seconds) sa znova zmenil, preto sa LaunchedEffect znova vykoná - pokračuj bodom 2Tú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í.