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.
Görev
KolayHisse 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 birStockPortfoliosı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,
_holdingsadında özel (private) birMap<String, int> _holdingsdeğ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 asenkronfetchPrice(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 asenkrongetStockValue(String symbol)yöntemi. Bu yöntem, sembol içinfetchPriceyö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 asenkrongetTotalValue()yöntemi. Bu, her bir hisse senedi içingetStockValueyöntemini bekleyerek ve sonuçları toplayarak tüm varlıkların birleşik değerini hesaplamalıdır - Bir
Future<String>döndüren asenkrongenerateReport()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ındanTotal: $[totalValue](yine 1 ondalık basamaklı) şeklinde son bir satır ekleyin
- Hisse senedi sembollerini ve sahip olunan hisse sayısını saklayan,
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 ileGOOGL, 8 hisse ileMSFT Fetching portfolio data...yazdırıngenerateReport()sonucunu bekleyin (await) ve yazdırın
- Bir
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.5Kopya 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
}
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
1OOP Temelleri
Harici DosyalarKütüphaneler ve ImportlarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarÖrnek DeğişkenleriConstructor TemelleriÖzet - Basit Hesap Makinesi4Null Safety
Null Safety'ye GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Kelimesi ve Null SafetyNull-Aware OperatörleriSınıflarda Null SafetyÖzet - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulama vs. GenişletmeÇoklu ArayüzlerÖzet - Şekil Hesaplayıcı10Koleksiyonlar ve Generic'ler
List, Set, Map Genel BakışTip Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorÖzet - Generic Depolama2Dart'ta Yapıcılar
Varsayılan Yapıcıİsimlendirilmiş Yapıcılarİlklendirme ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Öneki KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DetaylarıBilgi GizlemeÖzet - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Fazla Mixin KullanımıMixin'lerde on Anahtar KelimesiMixin vs KalıtımMixin vs ArayüzÖzet - Hayvan Sistemi11Özel Metotlar
toString() OverridehashCode ve == OverrideComparable Arayüzücall() MetodunoSuchMethod OverrideÖzet - Özel Koleksiyon14Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı17Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakter SistemiAraç Kiralama Servisi3Sınıf Özellikleri
Instance ve Statik ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatik Metotlar ve AlanlarGetters ve SettersÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar KelimesiMetot Ezme@override Anotasyonufinal Sınıf Anahtar KelimesiYapıcı Metotlar ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriInterface'ler ile Çok BiçimlilikÇalışma Zamanı Tip Kontrolüis ve as OperatörleriCovariant Anahtar KelimesiÖzet - Ödeme İşlemcisi12Asenkron OOP
Futures ve async/awaitStream TemelleriStream Controller'larAsenkron KurucularSınıf Metotlarında Asenkron KullanımıÖzet - Data Fetcher15Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı