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.
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()).
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.
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(...) }.
// 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))
}
}
[ ] 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)
Documentazione ufficiale Kotlin Coroutines
Android Developers: Guide to App Architecture (MVVM)
Jetpack Compose Basics (Android Developers)