Menu
Coddy logo textTech

Sınıf Metotlarında Asenkron Kullanımı

Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 80 / 110.

Artık fabrika metotları ile asenkron başlatmayı nasıl yöneteceğinizi bildiğinize göre, normal örnek metotlarını asenkron hale getirmeye bakalım. Bu oldukça basittir; herhangi bir metoda async eklemeniz ve bir Future döndürmesini sağlamanız yeterlidir.

class WeatherService {
  String _location;
  
  WeatherService(this._location);
  
  Future<String> fetchTemperature() async {
    await Future.delayed(Duration(seconds: 1));
    return '22°C in $_location';
  }
  
  Future<void> updateLocation(String newLocation) async {
    await Future.delayed(Duration(milliseconds: 500));
    _location = newLocation;
    print('Location updated to $_location');
  }
}

Future<void> main() async {
  var service = WeatherService('London');
  var temp = await service.fetchTemperature();
  print(temp);
  
  await service.updateLocation('Paris');
}

Asenkron metotlar, tıpkı normal metotlar gibi örnek değişkenlerine erişebilir ve bunları değiştirebilir. Temel fark, çağıranların sonucu await ile beklemesi gerekmesidir. Future<void> döndüren metotlar bir değer döndürmezler, ancak devam etmeden önce tamamlandıklarından emin olmak istiyorsanız yine de beklenmeleri gerekir.

Bir metot içinde birden fazla asenkron çağrıyı birleştirebilir veya aynı sınıftan diğer asenkron metotları çağırabilirsiniz:

Future<String> getFullReport() async {
  var temp = await fetchTemperature();
  var humidity = await fetchHumidity();
  return '$temp, Humidity: $humidity';
}

Bu kalıp; API'ler, veritabanları veya zaman alan herhangi bir işlem gibi harici kaynaklarla etkileşime giren sınıflar için elzemdir.

challenge icon

Görev

Kolay

Hisse senedi fiyatlarını yöneten ve asenkron yöntemler kullanarak portföy değerlerini hesaplayan bir hisse senedi portföy takipçisi oluşturalım! Gerçek zamanlı hisse senedi verilerini almayı simüle eden ve raporlar oluşturmak için birden fazla asenkron işlemi birleştiren bir sınıf oluşturacaksınız.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • portfolio.dart: Hisse senetlerini ve miktarlarını takip eden bir StockPortfolio sınıfı oluşturun. Sınıfınız şunlara sahip olmalıdır:
    • Hisse senedi sembollerini ve sahip olunan hisse sayısını saklayan, _holdings adında özel (private) bir Map<String, int>
    • _holdings değişkenini boş bir map olarak başlatan bir yapıcı (constructor)
    • Bir hisse senedi varlığını ekleyen veya güncelleyen addStock(String symbol, int quantity) yöntemi (asenkron değil)
    • Bir Future<double> döndüren asenkron fetchPrice(String symbol) yöntemi. 50 milisaniyelik bir gecikme simüle edin, ardından şu şekilde hesaplanan bir fiyat döndürün: sembolün uzunluğu çarpı 25.5
    • Bir Future<double> döndüren asenkron getStockValue(String symbol) yöntemi. Bu yöntem, sembol için fetchPrice yöntemini beklemeli (await), elde tutulan miktar ile çarpmalı ve toplam değeri döndürmelidir. Sembol varlıklar arasında yoksa 0.0 döndürün
    • Bir Future<double> döndüren asenkron getTotalValue() yöntemi. Bu, her bir hisse senedi için getStockValue yöntemini bekleyerek ve sonuçları toplayarak tüm varlıkların birleşik değerini hesaplamalıdır
    • Bir Future<String> döndüren asenkron generateReport() yöntemi. Bu, her bir hisse senedinin değerini ve toplamı gösteren bir rapor oluşturmalıdır. Her satırı [symbol]: $[value] (değer 1 ondalık basamaklı) şeklinde formatlayın ve ardından Total: $[totalValue] (yine 1 ondalık basamaklı) şeklinde son bir satır ekleyin
  • main.dart: Portföy dosyanızı içe aktarın ve asenkron yöntemlerin bir sınıf içinde nasıl birlikte çalıştığını gösterin:
    • Bir StockPortfolio örneği oluşturun
    • Şu varlıkları ekleyin: 10 hisse ile AAPL, 5 hisse ile GOOGL, 8 hisse ile MSFT
    • Fetching portfolio data... yazdırın
    • generateReport() sonucunu bekleyin (await) ve yazdırın

generateReport() yönteminin aynı sınıf içindeki diğer asenkron yöntemleri nasıl çağırdığına ve her yöntemin diğerlerinin üzerine nasıl inşa edildiğine dikkat edin. Ondalık değerleri formatlamak için toStringAsFixed(1) kullanın!

Beklenen çıktı:

Fetching portfolio data...
AAPL: $1020.0
GOOGL: $637.5
MSFT: $816.0
Total: $2473.5

Kopya kağıdı

Örnek metotlarını (instance methods) asenkron hale getirmek için async anahtar kelimesini ekleyin ve bir Future döndürün:

class WeatherService {
  String _location;
  
  WeatherService(this._location);
  
  Future<String> fetchTemperature() async {
    await Future.delayed(Duration(seconds: 1));
    return '22°C in $_location';
  }
  
  Future<void> updateLocation(String newLocation) async {
    await Future.delayed(Duration(milliseconds: 500));
    _location = newLocation;
    print('Location updated to $_location');
  }
}

Asenkron metotlar örnek değişkenlerine erişebilir ve bunları değiştirebilir. Çağıranlar sonucu await ile beklemelidir. Future<void> döndüren metotlar bir değer döndürmezler ancak tamamlandıklarından emin olmak için yine de beklenmeleri (awaited) gerekir.

Asenkron metotlar, aynı sınıf içindeki diğer asenkron metotları çağırabilir:

Future<String> getFullReport() async {
  var temp = await fetchTemperature();
  var humidity = await fetchHumidity();
  return '$temp, Humidity: $humidity';
}

Bu desen, API'ler veya veritabanları gibi harici kaynaklarla etkileşime giren sınıflar için temeldir.

Kendin dene

import 'portfolio.dart';

void main() async {
  // TODO: Bir StockPortfolio örneği oluşturun

  // TODO: Varlıkları ekleyin:
  // - 10 adet AAPL hissesi
  // - 5 adet GOOGL hissesi
  // - 8 adet MSFT hissesi

  // TODO: "Fetching portfolio data..." yazdırın

  // TODO: generateReport() sonucunu bekleyin (await) ve 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