Menu
CoddyTech

Dasar-Dasar Stream

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 77 dari 110.

Jika Future memberikan satu nilai, Stream memberikan urutan nilai seiring waktu. Bayangkan seperti pipa yang dapat mengeluarkan beberapa bagian data, cocok untuk peristiwa, pembaruan waktu nyata, atau memproses data bagian demi bagian.

Kamu dapat membuat stream sederhana menggunakan Stream.fromIterable() atau fungsi generator asinkron dengan async* dan yield:

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

Future<void> main() async {
  await for (var number in countToThree()) {
    print(number);
  }
}
// output: 1, 2, 3

Kata kunci async* menandai fungsi yang mengembalikan Stream, dan yield mengeluarkan setiap nilai. Untuk mengonsumsi stream, gunakan await for yang memproses setiap nilai saat tiba.

Kamu juga dapat mendengarkan stream menggunakan method listen(), yang menerima fungsi callback:

Stream<String> greetings() async* {
  yield 'Hello';
  yield 'Hi';
  yield 'Hey';
}

void main() {
  greetings().listen((message) {
    print(message);
  });
}

Perbedaan utama dengan Future: Future selesai sekali dengan satu nilai, sedangkan Stream dapat menghasilkan banyak nilai sebelum selesai. Karena itu, Stream ideal untuk menangani data yang terus mengalir, seperti interaksi pengguna, pembacaan sensor, atau data yang tiba dalam beberapa bagian.

challenge icon

Tantangan

Mudah

Mari buat sistem timer hitung mundur yang mengeluarkan nilai seiring waktu menggunakan stream! Kamu akan membuat class yang menghasilkan urutan angka hitung mundur, sekaligus menunjukkan cara stream mengirimkan beberapa nilai, bukan hanya satu.

Kamu akan mengatur kodemu ke dalam dua file:

  • countdown.dart: Buat class Countdown yang menghasilkan stream hitung mundur. Class-mu harus memiliki:
    • Field start (int) yang menyimpan angka awal hitung mundur
    • Constructor yang menerima angka awal
    • Method countDown() yang mengembalikan Stream<int>. Gunakan async* dan yield untuk mengeluarkan angka dari start hingga 0 (inklusif)
    • Method countDownWithMessage() yang mengembalikan Stream<String>. Method ini harus mengeluarkan string dengan format 'T-minus [number]' untuk setiap angka dari start hingga 1, lalu mengeluarkan 'Liftoff!' sebagai nilai terakhir
  • main.dart: Impor file hitung mundurmu dan tunjukkan kedua method stream. Fungsi main-mu harus menggunakan async dan:
    • Membuat instance Countdown yang dimulai dari 3
    • Mencetak Number countdown:
    • Menggunakan await for untuk melakukan iterasi melalui countDown() dan mencetak setiap angka
    • Mencetak baris kosong
    • Mencetak Launch sequence:
    • Menggunakan await for untuk melakukan iterasi melalui countDownWithMessage() dan mencetak setiap pesan

Perhatikan bagaimana setiap pernyataan yield mengeluarkan nilai melalui stream, dan await for memproses setiap nilai saat nilai itu tiba. Berbeda dengan Future yang memberikan satu hasil, stream-mu akan mengeluarkan beberapa nilai secara berurutan!

Output yang diharapkan:

Number countdown:
3
2
1
0

Launch sequence:
T-minus 3
T-minus 2
T-minus 1
Liftoff!

Coba sendiri

import 'countdown.dart';

Future<void> main() async {
  // TODO: Buat instance Countdown yang dimulai dari 3
  
  // TODO: Cetak 'Number countdown:'
  
  // TODO: Gunakan await for untuk mengulangi countDown() dan mencetak setiap angka
  
  // TODO: Cetak baris kosong
  
  // TODO: Cetak 'Launch sequence:'
  
  // TODO: Gunakan await for untuk mengulangi countDownWithMessage() dan mencetak setiap pesan
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Dart online