collectAsStateWithLifecycle
Raccolga i flow in sicurezza rispettando il ciclo di vita.
collectAsStateWithLifecycle è una lezione Android Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Android Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Android Academy include 4 lezioni in totale.
Raccogliere i flow in modo sicuro
Quando un composable raccoglie un flow, idealmente dovrebbe smettere di raccoglierlo mentre la schermata è in background e riprendere quando torna in primo piano.
Lo strumento per farlo è collectAsStateWithLifecycle().
Il problema di collectAsState
Il semplice collectAsState() continua a raccogliere dati finché il composable si trova nella composizione — anche quando l'app è in background.
Questo può sprecare risorse ed elaborare aggiornamenti che l'utente non può vedere.
Ecco collectAsStateWithLifecycle
Questo collector consapevole del ciclo di vita sospende la raccolta quando il ciclo di vita scende al di sotto di uno stato obiettivo (STARTED per impostazione predefinita) e la riprende quando vi ritorna.
import androidx.lifecycle.compose.collectAsStateWithLifecycle
@Composable
fun Screen(vm: MyViewModel) {
val state by vm.uiState
.collectAsStateWithLifecycle()
Text(state.title)
}La dipendenza
Si trova nell'artefatto androidx.lifecycle:lifecycle-runtime-compose. Lo aggiunga al modulo affinché l'import venga risolto.
// build.gradle (module)
implementation(
"androidx.lifecycle:lifecycle-runtime-compose:2.x.x"
)Stato minimo predefinito: STARTED
Per impostazione predefinita, la raccolta è attiva quando il ciclo di vita è almeno nello stato STARTED — cioè quando la schermata è visibile. Quando passa in background (al di sotto di STARTED), la raccolta viene sospesa.
Personalizzare lo stato minimo
Può modificare la soglia con minActiveState, ad esempio impostandola su RESUMED.
val state by vm.uiState.collectAsStateWithLifecycle(
minActiveState = Lifecycle.State.RESUMED
)Abbinamento con StateFlow
Questo funziona perfettamente con lo StateFlow esposto da un ViewModel. Il flow ha sempre un valore corrente, quindi una nuova raccolta mostra immediatamente lo stato più recente.
private val _uiState = MutableStateFlow(UiState())
val uiState = _uiState.asStateFlow()Perché riduce il lavoro
Se il Suo flow attiva un'elaborazione costosa (come filtrare un elenco di grandi dimensioni o trasformare stream), sospendere la raccolta in background significa che tale lavoro non viene eseguito mentre l'utente non è presente.
Combinare con viewModelScope
Dal lato del producer, il ViewModel esegue spesso la propria pipeline di dati in viewModelScope. Con stateIn può persino fare in modo che l'origine upstream si interrompa quando non ci sono collector.
val uiState = repository.stream()
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5000),
initialValue = UiState()
)Spiegazione di WhileSubscribed
WhileSubscribed(5000) mantiene attiva l'origine upstream per 5 secondi dopo l'uscita dell'ultimo collector. In questo modo evita di riavviare il lavoro durante brevi cambi di configurazione, interrompendolo comunque quando l'utente abbandona davvero la schermata.
Riepilogo delle buone pratiche
Per le schermate Compose basate su un ViewModel:
- Esponga uno
StateFlow. - Lo raccolga con
collectAsStateWithLifecycle(). - Facoltativamente, usi
stateIn(WhileSubscribed)upstream.
Verifica rapida
Verifichi la Sua comprensione della raccolta consapevole del ciclo di vita.
Riepilogo
Ha imparato che:
collectAsStateWithLifecycle()sospende la raccolta in background.- La soglia predefinita è STARTED e può essere modificata tramite
minActiveState. - Lo abbini a uno
StateFlowe astateIn(WhileSubscribed)per ottenere una pipeline efficiente.
Domande Frequenti
La lezione «collectAsStateWithLifecycle» è gratuita?
Sì — il testo completo di «collectAsStateWithLifecycle» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Android Academy, passa a CoddyKit PRO. Il corso Android Academy include 4 lezioni in totale.
Cosa imparerò in «collectAsStateWithLifecycle»?
Raccolga i flow in sicurezza rispettando il ciclo di vita. Eserciti Android Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Android Academy?
Non è richiesta alcuna esperienza precedente. Android Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «collectAsStateWithLifecycle»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Android Academy?
Sì. Ogni lezione Android Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Perché usare un ViewModel?
- Esporre lo stato dal ViewModel
- Il ciclo di vita di Android
- collectAsStateWithLifecycle