Android Kotlin — Cheat Sheet

Tag: android, kotlin, coroutines, flow, jetpack, viewmodel, compose

Livello: intermedio

TL;DR: Sintesi dei concetti fondamentali di Kotlin per lo sviluppo Android, incluse Coroutines, StateFlow, architettura MVVM e Jetpack Compose.

Concetti chiave

Kotlin è il linguaggio ufficiale per Android (Google I/O 2017), nativamente interoperabile con Java.

Null safety: i tipi non possono essere null di default, prevenendo le NullPointerException.

Extension functions: permettono di aggiungere metodi a classi esistenti senza ereditarle.

Data classes: classi progettate per contenere dati, generano in automatico equals, hashCode, toString e copy.

Coroutines: framework per la programmazione asincrona, estremamente più leggero dei thread tradizionali.

Flow e StateFlow: API reattive per gestire stream di dati asincroni, naturali sostituti di RxJava e LiveData.

Architettura MVVM: pattern raccomandato (Model per dati, View per UI, ViewModel per logica e stato).

Jetpack Compose: toolkit UI dichiarativo moderno, utilizza funzioni @Composable al posto dei layout XML.

Delegated properties: pattern per delegare getter/setter (es. by lazy, by viewModels()).

Domande tipiche e risposte pronte

Q: Qual è la differenza tra val e var?R: val definisce una variabile di sola lettura (immutabile dopo l'assegnazione), mentre var definisce una variabile mutabile.

Q: Come funzionano le Coroutines rispetto ai Thread?R: Sono thread leggeri gestiti a livello utente. Migliaia di coroutine possono girare su un singolo thread grazie al meccanismo di sospensione (suspend), senza bloccare il thread sottostante.

Q: Cosa fa esattamente by lazy?R: È un property delegate che ritarda l'inizializzazione della variabile al momento del suo primo utilizzo effettivo, migliorando le performance all'avvio.

Q: Qual è il vantaggio di StateFlow rispetto a LiveData?R: StateFlow fa parte della libreria standard Kotlin (non dipende dal framework Android), supporta operatori avanzati e richiede sempre un valore iniziale obbligatorio.

Insidie e errori comuni

Abusare dell'operatore !! (not-null assertion), reintroducendo il rischio di crash per NullPointerException a runtime.

Eseguire operazioni pesanti o di I/O sul Dispatchers.Main, causando il blocco della UI (ANR).

Dimenticare di cancellare i Job delle coroutine alla distruzione della view (risolvibile usando viewModelScope o lifecycleScope).

Modificare lo stato di Compose direttamente fuori da un blocco reattivo come remember { mutableStateOf(...) }.

Snippet e comandi

// Esempio di ViewModel con Coroutines e StateFlow
class MainViewModel : ViewModel() {
    private val _uiState = MutableStateFlow<UiState>(UiState.Loading)
    val uiState: StateFlow<UiState> = _uiState.asStateFlow()

    fun fetchData() {
        viewModelScope.launch(Dispatchers.IO) {
            try {
                val data = repository.getData()
                _uiState.value = UiState.Success(data)
            } catch (e: Exception) {
                _uiState.value = UiState.Error(e.message)
            }
        }
    }
}

// Esempio base di un componente UI Jetpack Compose
@Composable
fun GreetingCard(name: String) {
    Card(modifier = Modifier.padding(16.dp)) {
        Text(text = "Hello $name!", modifier = Modifier.padding(8.dp))
    }
}

Da ripassare

[ ] Ciclo di vita dei ViewModel rispetto a Activity e Fragment

[ ] Operatori Flow intermedi (map, filter, combine, flatMapLatest)

[ ] Ottimizzazione della re-composition in Jetpack Compose (remember, derivedStateOf)

Riferimenti

Documentazione ufficiale Kotlin Coroutines

Android Developers: Guide to App Architecture (MVVM)

Jetpack Compose Basics (Android Developers)

Jarvis Interviews
Jarvis