Menu
Coddy logo textTech

בקרי Streams

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Dart של Coddy. שיעור 78 מתוך 110.

בעוד שמחוללי async* מצוינים ליצירת זרמים עם נתונים מוגדרים מראש, לפעמים דרושה לך שליטה רבה יותר — למשל, הוספת נתונים לזרם מחלקים שונים בקוד שלך. כאן נכנס לתמונה StreamController.

StreamController משמש כמנהל של זרם. הוא מספק לך "כיור" להוספת נתונים ו"זרם" שמאזינים יכולים להירשם אליו:

import 'dart:async';

void main() {
  var controller = StreamController<String>();
  
  // האזן לזרם
  controller.stream.listen((data) {
    print('Received: $data');
  });
  
  // הוסף נתונים דרך ה-sink
  controller.add('Hello');
  controller.add('World');
  
  controller.close();  // תמיד סגור בסיום
}

השיטה add() מוסיפה ערכים חדשים לזרם, וכל המאזינים מקבלים אותם מיד. תמיד כדאי לקרוא ל־close() כשתסיים, כדי לשחרר משאבים.

כברירת מחדל, לזרם יכול להיות מאזין אחד בלבד. כדי להוסיף כמה מאזינים, השתמשו בבקר לשידור:

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 חיוניים ב-OOP ליצירת מחלקות מונחות אירועים — למשל, כדי להודיע לחלקים שונים באפליקציה שלך כשנתונים משתנים, לטפל בפעולות משתמש או לנהל עדכונים בזמן אמת בתוך האובייקטים שלך.

challenge icon

אתגר

קל

בוא נבנה מערכת מרכז הודעות שמאפשרת למספר מנויים לקבל הודעות בזמן אמת! תשתמש ב־StreamController כדי לנהל את זרימת ההודעות ולהדגים איך זרמי שידור מאפשרים למספר מאזינים להאזין.

תארגן את הקוד שלך בשני קבצים:

  • message_hub.dart: צור מחלקה בשם MessageHub שמנהלת הפצת הודעות באמצעות StreamController. המרכז שלך צריך:
    • להשתמש פנימית ב־StreamController<String> לשידור, כדי שמספר מאזינים יוכלו להירשם
    • לספק getter בשם messages שמחזיר את הזרם שאליו מאזינים יכולים להירשם
    • להכיל מתודה broadcast(String message) שמוסיפה הודעה לזרם
    • להכיל מתודה shutdown() שסוגרת את הבקר
  • main.dart: ייבא את מרכז ההודעות שלך והגדר תרחיש עם מספר מנויים שמאזינים לאותו זרם:
    • צור מופע של MessageHub
    • הוסף מאזין ראשון שמדפיס הודעות בתבנית: Subscriber A: [message]
    • הוסף מאזין שני שמדפיס הודעות בתבנית: Subscriber B: [message]
    • שדר שלוש הודעות: Hello everyone, Welcome to the hub, ו־Goodbye
    • סגור את המרכז

זכור לייבא את dart:async בקובץ מרכז ההודעות שלך כדי לגשת אל StreamController. שים לב איך שני המנויים מקבלים כל הודעה שמשודרת — זה הכוח של זרמי שידור!

פלט צפוי:

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

נסו בעצמכם

import 'message_hub.dart';

void main() {
  // TODO: ליצור מופע של MessageHub
  
  // TODO: להוסיף מאזין ראשון שמדפיס: Subscriber A: [message]
  
  // TODO: להוסיף מאזין שני שמדפיס: Subscriber B: [message]
  
  // TODO: לשדר שלוש הודעות:
  // - "Hello everyone"
  // - "Welcome to the hub"
  // - "Goodbye"
  
  // TODO: לכבות את ה-hub
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Dart אונליין