Sobes.tech
Junior

Για ποιο λόγο χρησιμοποιούνται τα streams στο Flutter;

sobes.tech AI

Απάντηση από AI

Οι ροές (streams) στο Flutter χρησιμοποιούνται για την επεξεργασία ακολουθιών ασύγχρονων γεγονότων.

Κύριες περιπτώσεις χρήσης:

  1. Ανταπόκριση σε αλλαγές δεδομένων: Redux, μοτίβα BLoC χρησιμοποιούν ροές για τη διαχείριση της κατάστασης της εφαρμογής και την ενημέρωση του UI με αντιδραστικό τρόπο κατά τις αλλαγές.
  2. Εργασία με δεδομένα σε ροή: Λήψη δεδομένων μέσω δικτύου (π.χ., WebSocket), ανάγνωση από αρχεία, εργασία με αισθητήρες συσκευής.
  3. Επεξεργασία αλληλεπιδράσεων χρήστη: Παρακολούθηση κύλισης, Draggable / DragTarget.
  4. Ασύγχρονες λειτουργίες: Εκτέλεση εργασιών στο παρασκήνιο και λήψη αποτελεσμάτων μόλις είναι διαθέσιμα.

Βασικές έννοιες:

  • Stream: Ακολουθία ασύγχρονων γεγονότων. Ένα stream μπορεί να εκπέμψει 0 ή περισσότερα γεγονότα και στη συνέχεια να τερματίσει (με επιτυχία ή σφάλμα).
  • StreamSubscription: Αντιπροσωπεύει μια συνδρομή σε ένα stream. Επιτρέπει την λήψη γεγονότων από το stream και τη διαχείριση της συνδρομής (παύση, συνέχιση, ακύρωση).
  • Sink: Χρησιμοποιείται για την προσθήκη δεδομένων στο stream.
  • StreamBuilder: Widget που ανακατασκευάζεται κατά τη λήψη νέων δεδομένων από το stream.
// Παράδειγμα χρήσης του StreamBuilder
StreamBuilder<int>(
  stream: counterStream, // Το stream σας
  builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
    if (snapshot.hasError) {
      return Text('Σφάλμα: \\${snapshot.error}');
    }
    switch (snapshot.connectionState) {
      case ConnectionState.none:
        return Text('Αναμονή...');
      case ConnectionState.waiting:
        return CircularProgressIndicator();
      case ConnectionState.active:
        return Text('Τιμή: \\${snapshot.data}');
      case ConnectionState.done:
        return Text('Το stream ολοκληρώθηκε. Τελευταία τιμή: \\${snapshot.data}');
    }
  },
)
// Παράδειγμα απλού stream που εκπέμπει αριθμούς
Stream<int> countStream(int max) async* {
  for (int i = 0; i <= max; i++) {
    await Future.delayed(Duration(seconds: 1));
    yield i; // Εκπέμπει την τιμή
  }
}