Dart Academy · Lezione

Creare stream con async*

Generare eventi da un generatore.

Lezione 4 di 413 passaggi

Creare stream con async* è una lezione Dart 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 Dart Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Dart Academy include 4 lezioni in totale.

Produrre i propri stream

Finora ha consumato stream creati da altri. Ora imparerà a produrli usando un async generator, il modo più semplice per emettere eventi.

La parola chiave async*

Contrassegni una funzione con async* per trasformarla in un generatore di stream. Il suo tipo restituito è uno Stream e può emettere valori nel tempo. 🚿

Stream<int> countTo(int n) async* {
  // body uses yield
}

yield emette un valore

All'interno di una funzione async*, yield invia un valore nello stream. L'esecuzione si mette in pausa in quel punto finché l'ascoltatore non è pronto per riceverne altri.

Stream<int> oneTwo() async* {
  yield 1;
  yield 2;
}

yield in un ciclo

Combini yield con un ciclo per emettere molti valori. A ogni iterazione, il numero successivo viene inviato automaticamente nello stream.

Stream<int> countTo(int n) async* {
  for (var i = 1; i <= n; i++) yield i;
}

await all'interno di async*

Poiché la funzione è async, può usare await tra due yield. In questo modo può recuperare dati o attendere prima di emettere l'evento successivo.

Stream<int> ticker() async* {
  while (true) {
    await Future.delayed(Duration(seconds: 1));
    yield DateTime.now().second;
  }
}

yield* inoltra uno stream

Usi yield* per emettere, dall'interno del generatore, ogni evento di un altro stream. In questo modo inserisce l'intero stream nel proprio.

Stream<int> combined() async* {
  yield* countTo(3);
  yield 99;
}

Lazy fino all'ascolto

Una funzione async* non inizia a essere eseguita finché qualcuno non la ascolta. Il corpo viene eseguito solo quando l'ascoltatore richiede ciascun valore. ⏸️

La pausa rispetta l'ascoltatore

Se un ascoltatore si mette in pausa, anche il generatore si ferma al successivo yield. Questa contropressione impedisce ai produttori di sovraccaricare i consumer.

Errori da async*

Un throw all'interno di una funzione async* diventa un evento di errore nello stream. Gli ascoltatori possono intercettarlo come qualsiasi altro errore dello stream.

Stream<int> risky() async* {
  yield 1;
  throw 'boom';
}

Consumare il proprio generatore

Legga lo stream generato nel modo consueto con await for. Ogni valore prodotto confluisce nel ciclo nell'ordine corretto.

await for (final n in countTo(3)) {
  print(n);
}

async* vs StreamController

Per un output sequenziale basato sul pull, async* è più semplice di uno StreamController. Scelga un controller solo quando gli eventi provengono da callback esterne.

Verifica rapida

Come si emette un valore da una funzione async*?

Riepilogo

Ha creato stream con async*, inviando valori tramite yield, inoltrandoli con yield* e usando await tra gli eventi. Ora sa sia consumare sia produrre stream. 🎉

Gratis per iniziare

Impara Dart con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
30
Lezioni
120

Domande Frequenti

La lezione «Creare stream con async*» è gratuita?

Sì — il testo completo di «Creare stream con async*» è 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 Dart Academy, passa a CoddyKit PRO. Il corso Dart Academy include 4 lezioni in totale.

Cosa imparerò in «Creare stream con async*»?

Generare eventi da un generatore. Eserciti Dart 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 Dart Academy?

Non è richiesta alcuna esperienza precedente. Dart 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 «Creare stream con async*»?

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 Dart Academy?

Sì. Ogni lezione Dart 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. Ascoltare con await for
  2. Stream singoli e broadcast
  3. Trasformare gli stream: map, where, take
  4. Creare stream con async*
← Torna a Dart Academy