Futures ve async/await
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 76 / 110.
Gerçek uygulamalarda, bir sunucudan veri çekmek, dosya okumak veya kullanıcı girişini beklemek gibi birçok işlem zaman alır. Dart bunları, gelecekte bir zamanda mevcut olacak bir değeri temsil eden Future ile yönetir.
Bir Future bir söz gibidir: "Hazır olduğunda sonucu sana vereceğim." Zaman alan bir işlemi simüle etmek için Future.delayed() kullanarak bir tane oluşturabilirsiniz:
Future<String> fetchUserName() {
return Future.delayed(
Duration(seconds: 1),
() => 'Alice',
);
}Bir Future'ın sonucuyla çalışmak için async ve await kullanın. Fonksiyonunuzu async olarak işaretleyin, ardından Future tamamlanana kadar yürütmeyi duraklatmak için await kullanın:
Future<void> main() async {
print('Fetching user...');
String name = await fetchUserName();
print('Hello, $name!');
}
Future<String> fetchUserName() {
return Future.delayed(
Duration(seconds: 1),
() => 'Alice',
);
}await olmadan, gerçek dize yerine bir Future<String> alırsınız. await anahtar kelimesi Future'ı açar ve size içindeki değeri verir. await kullanan herhangi bir fonksiyonun async olarak işaretlenmesi gerektiğini ve otomatik olarak bir Future döndürdüğünü unutmayın.
async fonksiyonlardan doğrudan değerler de döndürebilirsiniz - Dart bunları otomatik olarak bir Future içine sarar:
Future<int> calculateTotal() async {
var a = await fetchNumber();
var b = await fetchNumber();
return a + b; // Otomatik olarak Future<int> içine sarılır
}Görev
KolayFarklı şehirlerden hava durumu verilerini almayı simüle eden bir hava durumu servisi oluşturalım! Tamamlanması zaman alan işlemleri yönetmek için Future, async ve await kullanma pratiği yapacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
weather_service.dart: Hava durumu bilgilerini almayı simüle eden birWeatherServicesınıfı oluşturun. Sınıfınız şunlara sahip olmalıdır:Future<int>döndüren birfetchTemperature(String city)metodu. Ağ gecikmesini simüle etmek için 100 milisaniyelik bir süre ileFuture.delayed()kullanın. Metot, şehir adına göre bir sıcaklık döndürmelidir: şehir adının uzunluğunu 3 ile çarparak döndürün.Future<String>döndüren birfetchCondition(String city)metodu. 100 milisaniye gecikme ileFuture.delayed()kullanın. Şehir adı çift sayıda karaktere sahipse'Sunny', aksi takdirde'Cloudy'döndürün.Future<String>döndüren asenkron birgetFullReport(String city)metodu. Bu metot hemfetchTemperaturehem defetchConditionmetotlarını beklemeli (await), ardından şu formatta bir dize döndürmelidir:'[city]: [temperature]C, [condition]'
main.dart: Hava durumu servisinizi içe aktarın ve asenkron işlemlerin nasıl çalıştığını gösterin. main fonksiyonunuz asenkron olmalı ve şunları yapmalıdır:- Bir
WeatherServiceörneği oluşturun Fetching weather data...yazdırın'Paris'için tam raporu bekleyin (await) ve yazdırın'Tokyo'için tam raporu bekleyin (await) ve yazdırın'London'için tam raporu bekleyin (await) ve yazdırınDone!yazdırın
- Bir
Her getFullReport çağrısının, birleştirilmiş sonucu döndürmeden önce hem sıcaklığın hem de durumun alınmasını nasıl beklediğine dikkat edin. await anahtar kelimesi, her bir Future tamamlanana kadar yürütmeyi duraklatır!
Beklenen çıktı:
Fetching weather data...
Paris: 15C, Cloudy
Tokyo: 15C, Cloudy
London: 18C, Sunny
Done!Kopya kağıdı
Bir Future, gelecekte mevcut olacak bir değeri temsil eder. Veri çekme veya dosya okuma gibi zaman alan işlemler için kullanılır.
Future.delayed() kullanarak bir Future oluşturun:
Future<String> fetchUserName() {
return Future.delayed(
Duration(seconds: 1),
() => 'Alice',
);
}Future'lar ile çalışmak için async ve await kullanın. Fonksiyonu async olarak işaretleyin ve Future tamamlanana kadar yürütmeyi duraklatmak için await kullanın:
Future<void> main() async {
print('Fetching user...');
String name = await fetchUserName();
print('Hello, $name!');
}await anahtar kelimesi Future'ı açar ve size gerçek değeri verir. O olmadan, dize yerine bir Future<String> alırsınız.
await kullanan herhangi bir fonksiyon async olarak işaretlenmelidir ve otomatik olarak bir Future döndürür.
Async fonksiyonlardan dönen değerler otomatik olarak bir Future içine sarılır:
Future<int> calculateTotal() async {
var a = await fetchNumber();
var b = await fetchNumber();
return a + b; // Otomatik olarak Future<int> içine sarılır
}Kendin dene
import 'weather_service.dart';
Future<void> main() async {
// TODO: Bir WeatherService örneği oluşturun
// TODO: 'Fetching weather data...' yazdırın
// TODO: 'Paris' için tam raporu bekleyin ve yazdırın
// TODO: 'Tokyo' için tam raporu bekleyin ve yazdırın
// TODO: 'London' için tam raporu bekleyin ve yazdırın
// TODO: 'Done!' yazdırın
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarKütüphaneler ve ImportlarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarÖrnek DeğişkenleriConstructor TemelleriÖzet - Basit Hesap Makinesi4Null Safety
Null Safety'ye GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Kelimesi ve Null SafetyNull-Aware OperatörleriSınıflarda Null SafetyÖzet - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulama vs. GenişletmeÇoklu ArayüzlerÖzet - Şekil Hesaplayıcı10Koleksiyonlar ve Generic'ler
List, Set, Map Genel BakışTip Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorÖzet - Generic Depolama2Dart'ta Yapıcılar
Varsayılan Yapıcıİsimlendirilmiş Yapıcılarİlklendirme ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Öneki KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DetaylarıBilgi GizlemeÖzet - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Fazla Mixin KullanımıMixin'lerde on Anahtar KelimesiMixin vs KalıtımMixin vs ArayüzÖzet - Hayvan Sistemi11Özel Metotlar
toString() OverridehashCode ve == OverrideComparable Arayüzücall() MetodunoSuchMethod OverrideÖzet - Özel Koleksiyon14Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı17Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakter SistemiAraç Kiralama Servisi3Sınıf Özellikleri
Instance ve Statik ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatik Metotlar ve AlanlarGetters ve SettersÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar KelimesiMetot Ezme@override Anotasyonufinal Sınıf Anahtar KelimesiYapıcı Metotlar ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriInterface'ler ile Çok BiçimlilikÇalışma Zamanı Tip Kontrolüis ve as OperatörleriCovariant Anahtar KelimesiÖzet - Ödeme İşlemcisi12Asenkron OOP
Futures ve async/awaitStream TemelleriStream Controller'larAsenkron KurucularSınıf Metotlarında Asenkron KullanımıÖzet - Data Fetcher15Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı