Menu
Coddy logo textTech

Sınıf Metotlarında Asenkronluk

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

Async yöntemleri kullanarak hisse senedi fiyatlarını yöneten ve 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 async işlemi birleştiren bir sınıf oluşturacaksın.

Kodunu iki dosyada düzenleyeceksin:

  • portfolio.dart: Hisseleri ve miktarlarını takip eden bir StockPortfolio sınıfı oluştur. Sınıfında şunlar bulunmalı:
    • Sahip olunan hisse senedi sembollerini ve hisse sayılarını depolayan, Map<String, int> adlı özel bir _holdings
    • _holdings değerini boş bir map olarak başlatan bir kurucu
    • Bir hisse senedi varlığını ekleyen veya güncelleyen (async olmayan) bir addStock(String symbol, int quantity) yöntemi
    • fetchPrice(String symbol) döndüren bir async Future<double> yöntemi. 50 milisaniyelik bir gecikme simüle et, ardından sembolün uzunluğunun 25.5 ile çarpılmasıyla hesaplanan bir fiyat döndür
    • getStockValue(String symbol) döndüren bir async Future<double> yöntemi. Bu yöntem, sembol için fetchPrice sonucunu await etmeli, fiyatı sahip olunan miktarla çarpmalı ve toplam değeri döndürmeli. Sembol varlıklarda yoksa 0.0 döndür
    • getTotalValue() döndüren bir async Future<double> yöntemi. Bu yöntem, her hisse senedi için getStockValue sonucunu await ederek ve sonuçları toplayarak tüm varlıkların birleşik değerini hesaplamalı
    • generateReport() döndüren bir async Future<String> yöntemi. Bu yöntem, her hisse senedinin değerini ve toplamı gösteren bir rapor oluşturmalı. Her satırı [symbol]: $[value] biçiminde (değer 1 ondalık basamakla) biçimlendir; ardından son satır olarak Total: $[totalValue] (yine 1 ondalık basamakla) ekle
  • main.dart: Portföy dosyanı içe aktar ve async yöntemlerin bir sınıf içinde birlikte nasıl çalıştığını göster:
    • Bir StockPortfolio örneği oluştur
    • Şu varlıkları ekle: 10 hisse ile AAPL, 5 hisse ile GOOGL, 8 hisse ile MSFT
    • Fetching portfolio data... yazdır
    • generateReport() sonucunu await et ve yazdır

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

Beklenen çıktı:

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

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

Kendi başına pratik yap: Online Dart derleyicisi