Menu
Coddy logo textTech

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ı
}
challenge icon

Görev

Kolay

Farklı ş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 bir WeatherService sınıfı oluştur. Sınıfında şunlar bulunmalı:
    • fetchTemperature(String city) döndüren bir Future<int> metodu. Ağ gecikmesini simüle etmek için 100 milisaniyelik bir süreyle Future.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 bir Future<String> metodu. 100 milisaniyelik gecikmeyle Future.delayed() kullan. Şehir adı çift sayıda karakter içeriyorsa 'Sunny', aksi takdirde 'Cloudy' döndür.
    • getFullReport(String city) döndüren bir async Future<String> metodu. Bu metot hem fetchTemperature hem de fetchCondition iç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ır
    • Done! yazdır

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
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online Dart derleyicisi