Študijné materiály

Funkcie vyššieho rádu sú funkcie, ktoré prijímajú alebo vracajú iné funkcie. V Compose ich používame veľmi často, napríklad callbacky pre kliknutia:

import androidx.compose.material3.*
import androidx.compose.runtime.*

// Funkcia vyssieho radu - prijima funkciu ako parameter
fun performAction(times: Int, action: () -> Unit) {
    repeat(times) { action() }
}

// Callback - funkcia ako parameter
@Composable
fun ClickCounter(onClick: () -> Unit) {
    Button(onClick = onClick) {
        Text("Klikni ma")
    }
}

@Composable
fun App() {
    var count by remember { mutableStateOf(0) }

    // Lambda { count++ } je funkcia, ktoru predame do Button
    ClickCounter(onClick = { count++ })

    Text("Pocet kliknuti: $count")
}

20.2.1 Lambda výrazy

Lambda je skrátený zápis anonymnej funkcie:

// Plna forma
val add = { a: Int, b: Int -> a + b }

// Skratena forma (ak je posledny parameter lambda)
fun doSomething(name: String, action: () -> Unit) {
    action()
}
doSomething("Test") { println("Hello") }

// Skratena forma (ak je jediny parameter lambda)
fun repeat(n: Int, action: (Int) -> Unit) {
    for (i in 0..<n) action(i)
}
repeat(5) { i -> println(i) }

20.2.2 Compose a lambda

V Compose sú callbacky takmer vždy lambdy:

Button(onClick = { /* co sa stane po kliknuti */ }) {
    Text("Klikni")
}

TextField(
    value = text,
    onValueChange = { newText -> text = newText }  // lambda
)

Lambda je funkcia bez mena. V Compose sa používa pre všetky interakcie.

Úlohy

Úloha 1

Napíš funkciu vyššieho rádu, ktorá prijme číslo a lambda funkciu na jeho spracovanie.

Úloha 2

Vytvor composable tlačidlo, ktoré prijme onClick callback ako parameter.

Úloha 3

Odovzdaj tlačidlu lambdu, ktorá zmení stav počítadla a zobraz aktualizovanú hodnotu.