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.
Tantangan
MudahMari 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 classMessageHubyang mengelola distribusi pesan menggunakan StreamController. Pusat pesanmu harus:- Menggunakan
StreamController<String>broadcast secara internal agar beberapa listener dapat berlangganan - Menyediakan getter bernama
messagesyang mengembalikan stream agar listener dapat berlangganan - Memiliki method
broadcast(String message)yang menambahkan pesan ke stream - Memiliki method
shutdown()yang menutup controller
- Menggunakan
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, danGoodbye - Matikan pusat pesan
- Buat instance
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: GoodbyeCoba 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
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
file Eksternallibrary dan ImporPengantar OOPClass dan ObjectKata kunci thismethodVariabel InstanceDasar-Dasar ConstructorRingkasan: Kalkulator Sederhana4Keamanan Null
Pengantar Keamanan NullBisa Null vs Tidak Bisa NullOperator ? dan !Kata Kunci late dan Keamanan NullOperator Penanganan NullKeamanan Null dalam classRangkuman: Sistem Profil Pengguna7class Abstrak & Antarmuka
class AbstrakMethod abstrakAntarmuka di DartAntarmuka ImplisitMengimplementasikan vs MemperluasBeberapa AntarmukaRingkasan: Kalkulator Bentuk10Koleksi dan Generik
Gambaran Umum list, set, dan MapKoleksi dengan Tipe AmanKelas GenerikMetode GenerikBatasan GenerikIterable dan IteratorUlasan: Penyimpanan Generik2Konstruktor dalam Dart
Konstruktor DefaultKonstruktor BernamaInitializer ListsKonstruktor KonstanKonstruktor FactoryKonstruktor RedirectingRangkuman, Pembuat Bentuk5Enkapsulasi
Member Publik vs PrivatKonvensi Prefiks _Privasi Tingkat libraryPendalaman Getter & SetterPenyembunyian InformasiRingkasan: Catatan Siswa8Mixin
Pengantar MixinMembuat MixinMenggunakan Beberapa MixinKata Kunci on pada MixinMixin vs. PewarisanMixin vs. InterfaceRangkuman: Sistem Hewan3Property Class
Anggota Instance vs StaticField Final dan ConstVariabel LateMethod dan Field StaticGetter dan SetterRangkuman: Pengelola Rekening Bank6Pewarisan
Pewarisan DasarKata Kunci superPenimpaan methodAnotasi @overrideKata Kunci class finalKonstruktor dan PewarisanRangkuman, Hierarki Karyawan9Polimorfisme
Dasar-Dasar PolimorfismePolimorfisme melalui AntarmukaPemeriksaan Tipe saat RuntimeOperator is & asKata Kunci KovarianRangkuman: Pemroses Pembayaran12OOP Asinkron
Futures & async/awaitDasar-Dasar StreamPengontrol StreamKonstruktor AsinkronAsync dalam Method ClassRangkuman: Pengambil DataLatihan sendiri: Compiler Dart online