Future'ler 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> elde edersiniz. await anahtar sözcüğü Future'ın içeriğini açar ve içindeki değeri size verir. await kullanan herhangi bir işlevin async olarak işaretlenmesi gerektiğini ve işlevin otomatik olarak bir Future döndürdüğünü unutmayın.
Değerleri doğrudan async işlevlerden 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ıldı
}Görev
KolayFarklı şehirlerden hava durumu verilerini almayı simüle eden bir hava durumu hizmeti oluşturalım! Tamamlanması zaman alan işlemleri yönetmek için Future, async ve await kullanma pratiği yapacaksın.
Kodunu iki dosyada düzenleyeceksin:
weather_service.dart: Hava durumu bilgilerinin alınmasını simüle eden birWeatherServicesınıfı oluştur. Sınıfında şunlar bulunmalı:fetchTemperature(String city)döndüren birFuture<int>metodu. Ağ gecikmesini simüle etmek için 100 milisaniyelik bir süreyleFuture.delayed()kullan. Metot, şehir adına göre bir sıcaklık döndürmeli: şehir adının uzunluğunu 3 ile çarp.fetchCondition(String city)döndüren birFuture<String>metodu. 100 milisaniyelik gecikmeyleFuture.delayed()kullan. Şehir adı çift sayıda karakter içeriyorsa'Sunny', aksi takdirde'Cloudy'döndür.getFullReport(String city)döndüren bir asyncFuture<String>metodu. Bu metot hemfetchTemperaturehem defetchConditioniçin await kullanmalı, ardından biçimlendirilmiş bir dize döndürmeli:'[city]: [temperature]C, [condition]'
main.dart: Hava durumu hizmetini içe aktar ve async işlemlerin nasıl çalıştığını göster. Main fonksiyonun async olmalı ve:- Bir
WeatherServiceörneği oluştur Fetching weather data...yazdır'Paris'için tam raporu bekle ve yazdır'Tokyo'için tam raporu bekle ve yazdır'London'için tam raporu bekle ve yazdırDone!yazdır
- Bir
getFullReport çağrılarının her birinin, birleştirilmiş sonucu döndürmeden önce hem sıcaklığın hem de durumun alınmasını beklediğine dikkat et! await anahtar sözcüğü, her Future tamamlanana kadar yürütmeyi duraklatır!
Beklenen çıktı:
Fetching weather data...
Paris: 15C, Cloudy
Tokyo: 15C, Cloudy
London: 18C, Sunny
Done!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
1Nesne Tabanlı Programlamanın Temelleri
Harici DosyalarKütüphaneler ve İçe AktarmalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar SözcüğüMetotlarÖrnek DeğişkenleriYapıcıların TemelleriTekrar - Basit Hesap Makinesi4Null Güvenliği
Null Güvenliğine GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Sözcüğü ve Null GüvenliğiNull-Aware OperatörlerSınıflarda Null GüvenliğiTekrar - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulamak ve GenişletmekBirden Çok ArayüzTekrar - Şekil Hesaplayıcı10Koleksiyonlar ve Generics
List, Set, Map Genel BakışTür Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorTekrar - Generic Depolama2Dart'ta Yapıcılar
Varsayılan YapıcıAdlandırılmış YapıcılarBaşlatıcı ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Ön Ek KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DerinliğiBilgi GizlemeTekrar - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Çok Mixin KullanımıMixin'lerde on Anahtar SözcüğüMixin ve Kalıtım KarşılaştırmasıMixin ve Arayüz KarşılaştırmasıÖzet - Hayvan Sistemi11Özel Metotlar
toString() Geçersiz KılmahashCode & == Geçersiz KılmaComparable Arayüzücall() MetodunoSuchMethod Geçersiz KılmaÖzet - Özel Koleksiyon14Tasarım Desenleri Bölüm 1
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy Deseni3Sınıf Özellikleri
Örnek ve Static ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatic Metotlar ve AlanlarGetter ve Setter'larÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar SözcüğüMetot Geçersiz Kılma@override Açıklamasıfinal Sınıf Anahtar SözcüğüKurucular ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriArayüzler Yoluyla Çok BiçimlilikÇalışma Zamanı Tür Denetimiis ve as OperatörleriCovariant Anahtar KelimesiTekrar - Ödeme İşlemcisi12Asenkron OOP
Future'ler ve async/awaitStream TemelleriStream DenetleyicileriAsenkron YapıcılarSınıf Metotlarında AsenkronlukÖzet - Veri Getirici15Tasarım Desenleri Bölüm 2
Komut DeseniAdaptör DeseniDekoratör DeseniŞablon Metot DeseniDurum DeseniBileşik DesenDepo DeseniKendi başına pratik yap: Online Dart derleyicisi