0Pricing
Android Academy · Lezione

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 StateFlow e a stateIn(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

  1. Perché usare un ViewModel?
  2. Esporre lo stato dal ViewModel
  3. Il ciclo di vita di Android
  4. collectAsStateWithLifecycle
← Torna a Android Academy