Menu
CoddyTech

Pengontrol Stream

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

Meskipun generator async* sangat cocok untuk membuat stream dengan data yang sudah ditentukan, terkadang kamu membutuhkan kontrol lebih, seperti menambahkan data ke stream dari berbagai bagian kodemu. Di sinilah StreamController berperan.

StreamController berfungsi sebagai pengelola stream. StreamController memberimu "sink" untuk menambahkan data dan "stream" yang dapat diikuti oleh para pendengar:

import 'dart:async';

void main() {
  var controller = StreamController<String>();
  
  // Dengarkan stream
  controller.stream.listen((data) {
    print('Received: $data');
  });
  
  // Tambahkan data melalui sink
  controller.add('Hello');
  controller.add('World');
  
  controller.close();  // Selalu tutup setelah selesai
}

method add() memasukkan nilai baru ke dalam stream, dan semua listener langsung menerimanya. Kamu harus selalu memanggil close() setelah selesai untuk membebaskan resource.

Secara default, stream hanya dapat memiliki satu listener. Untuk beberapa listener, gunakan controller broadcast:

import 'dart:async';

void main() {
  var controller = StreamController<int>.broadcast();
  
  controller.stream.listen((n) => print('Listener 1: $n'));
  controller.stream.listen((n) => print('Listener 2: $n'));
  
  controller.add(42);
  controller.close();
}

StreamControllers penting dalam OOP untuk membangun class berbasis peristiwa, seperti memberi tahu beberapa bagian aplikasi saat data berubah, menangani tindakan pengguna, atau mengelola pembaruan real-time di dalam object-mu.

challenge icon

Tantangan

Mudah

Mari kita buat sistem pusat pesan yang memungkinkan beberapa subscriber menerima pesan secara real time! Kamu akan menggunakan StreamController untuk mengelola aliran pesan dan menunjukkan cara stream broadcast memungkinkan beberapa listener.

Kamu akan mengatur kodemu ke dalam dua file:

  • message_hub.dart: Buat class MessageHub yang mengelola distribusi pesan menggunakan StreamController. Pusat pesanmu harus:
    • Menggunakan StreamController<String> broadcast secara internal agar beberapa listener dapat berlangganan
    • Menyediakan getter bernama messages yang mengembalikan stream agar listener dapat berlangganan
    • Memiliki method broadcast(String message) yang menambahkan pesan ke stream
    • Memiliki method shutdown() yang menutup controller
  • main.dart: Impor pusat pesanmu dan siapkan skenario dengan beberapa subscriber yang mendengarkan stream yang sama:
    • Buat instance MessageHub
    • Tambahkan listener pertama yang mencetak pesan dalam format: Subscriber A: [message]
    • Tambahkan listener kedua yang mencetak pesan dalam format: Subscriber B: [message]
    • Broadcast tiga pesan: Hello everyone, Welcome to the hub, dan Goodbye
    • Matikan pusat pesan

Ingat untuk mengimpor dart:async dalam file pusat pesanmu agar dapat menggunakan StreamController. Perhatikan bahwa kedua subscriber menerima setiap pesan yang di-broadcast. Itulah keunggulan stream broadcast!

Output yang diharapkan:

Subscriber A: Hello everyone
Subscriber B: Hello everyone
Subscriber A: Welcome to the hub
Subscriber B: Welcome to the hub
Subscriber A: Goodbye
Subscriber B: Goodbye

Coba sendiri

import 'message_hub.dart';

void main() {
  // TODO: Buat instance MessageHub
  
  // TODO: Tambahkan listener pertama yang mencetak: Subscriber A: [message]
  
  // TODO: Tambahkan listener kedua yang mencetak: Subscriber B: [message]
  
  // TODO: Siarkan tiga pesan:
  // - "Hello everyone"
  // - "Welcome to the hub"
  // - "Goodbye"
  
  // TODO: Matikan hub
}
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