Sobes.tech
Junior

Πώς λειτουργεί η λέξη-κλειδί await στον ασύγχρονο προγραμματισμό στο Flutter;

sobes.tech AI

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

Η λέξη-κλειδί await χρησιμοποιείται σε ασύγχρονες συναρτήσεις (σημειωμένες με τη λέξη-κλειδί async) για να διακόψει την εκτέλεση της συνάρτησης μέχρι το Future να ολοκληρωθεί και να επιστρέψει ένα αποτέλεσμα.

Αρχή λειτουργίας:

  1. Όταν η εκτέλεση φτάσει στη γραμμή με await, η τρέχουσα συνάρτηση παγώνει.
  2. Ο έλεγχος επιστρέφει στον καλούντα κώδικα (ή στον βρόχο γεγονότων), επιτρέποντας σε άλλα μέρη του προγράμματος να εκτελεστούν. Αυτό αποτρέπει το μπλοκάρισμα του UI.
  3. Όταν το Future που αναφέρεται με await ολοκληρωθεί (δηλαδή, εκτελέσει την ασύγχρονη λειτουργία του και επιστρέψει μια τιμή ή ρίξει μια εξαίρεση), η παγωμένη συνάρτηση συνεχίζει από το σημείο που διακόπηκε.
  4. Αν το Future ολοκληρώθηκε με επιτυχία, η τιμή που επιστρέφει γίνεται το αποτέλεσμα της έκφρασης await.
  5. Αν το Future τελειώσει με σφάλμα (ρίξει εξαίρεση), αυτή η εξαίρεση θα ριχτεί στο σημείο που καλείται το await.

Παράδειγμα:

// Ασύγχρονη συνάρτηση με `async`
Future<String> fetchData() async {
  // Προσομοίωση ασύγχρονης λειτουργίας (π.χ. αίτημα δικτύου)
  await Future.delayed(Duration(seconds: 2));
  return 'Δεδομένα από το δίκτυο!';
}

void main() async {
  print('Ξεκίνημα λήψης δεδομένων...');

  // Χρήση `await` για αναμονή ολοκλήρωσης του Future
  try {
    String data = await fetchData();
    print('Λήφθηκε: $data');
  } catch (e) {
    print('Σφάλμα κατά τη λήψη δεδομένων: $e');
  }

  print('Το πρόγραμμα ολοκληρώθηκε (αν και το await μπορεί ακόμα να εκτελείται)');
}

Σε αυτό το παράδειγμα, το main σημειώνεται ως async για να μπορεί να χρησιμοποιήσει το await. Η κλήση await fetchData() διακόπτει την εκτέλεση του main για 2 δευτερόλεπτα, χωρίς να μπλοκάρει το κύριο νήμα του UI. Ενώ το fetchData περιμένει, άλλα μέρη της εφαρμογής μπορούν να συνεχίσουν να λειτουργούν. Μόλις το fetchData ολοκληρωθεί, η εκτέλεση του main συνεχίζεται και η μεταβλητή data λαμβάνει την επιστρεφόμενη τιμή.