Menu
Coddy logo textTech

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

Görev

Kolay

Farklı ş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 bir WeatherService sınıfı oluşturun. Sınıfınız şunlara sahip olmalıdır:
    • Future<int> döndüren bir fetchTemperature(String city) metodu. Ağ gecikmesini simüle etmek için 100 milisaniyelik bir süre ile Future.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 bir fetchCondition(String city) metodu. 100 milisaniye gecikme ile Future.delayed() kullanın. Şehir adı çift sayıda karaktere sahipse 'Sunny', aksi takdirde 'Cloudy' döndürün.
    • Future<String> döndüren asenkron bir getFullReport(String city) metodu. Bu metot hem fetchTemperature hem de fetchCondition metotları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ın
    • Done! yazdırın

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
}
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