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.
Görev
KolayAsync 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 birStockPortfoliosı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 _holdingsdeğ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 asyncFuture<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ürgetStockValue(String symbol)döndüren bir asyncFuture<double>yöntemi. Bu yöntem, sembol içinfetchPricesonucunu await etmeli, fiyatı sahip olunan miktarla çarpmalı ve toplam değeri döndürmeli. Sembol varlıklarda yoksa 0.0 döndürgetTotalValue()döndüren bir asyncFuture<double>yöntemi. Bu yöntem, her hisse senedi içingetStockValuesonucunu await ederek ve sonuçları toplayarak tüm varlıkların birleşik değerini hesaplamalıgenerateReport()döndüren bir asyncFuture<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 olarakTotal: $[totalValue](yine 1 ondalık basamakla) ekle
- Sahip olunan hisse senedi sembollerini ve hisse sayılarını depolayan,
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 ileGOOGL, 8 hisse ileMSFT Fetching portfolio data...yazdırgenerateReport()sonucunu await et ve yazdır
- Bir
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.5Kendin 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
1Nesne Tabanlı Programlamanın Temelleri
Harici DosyalarKütüphaneler ve İçe AktarmalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar SözcüğüMetotlarÖrnek DeğişkenleriYapıcıların TemelleriTekrar - Basit Hesap Makinesi4Null Güvenliği
Null Güvenliğine GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Sözcüğü ve Null GüvenliğiNull-Aware OperatörlerSınıflarda Null GüvenliğiTekrar - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulamak ve GenişletmekBirden Çok ArayüzTekrar - Şekil Hesaplayıcı10Koleksiyonlar ve Generics
List, Set, Map Genel BakışTür Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorTekrar - Generic Depolama2Dart'ta Yapıcılar
Varsayılan YapıcıAdlandırılmış YapıcılarBaşlatıcı ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Ön Ek KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DerinliğiBilgi GizlemeTekrar - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Çok Mixin KullanımıMixin'lerde on Anahtar SözcüğüMixin ve Kalıtım KarşılaştırmasıMixin ve Arayüz KarşılaştırmasıÖzet - Hayvan Sistemi11Özel Metotlar
toString() Geçersiz KılmahashCode & == Geçersiz KılmaComparable Arayüzücall() MetodunoSuchMethod Geçersiz KılmaÖzet - Özel Koleksiyon14Tasarım Desenleri Bölüm 1
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy Deseni3Sınıf Özellikleri
Örnek ve Static ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatic Metotlar ve AlanlarGetter ve Setter'larÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar SözcüğüMetot Geçersiz Kılma@override Açıklamasıfinal Sınıf Anahtar SözcüğüKurucular ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriArayüzler Yoluyla Çok BiçimlilikÇalışma Zamanı Tür Denetimiis ve as OperatörleriCovariant Anahtar KelimesiTekrar - Ödeme İşlemcisi12Asenkron OOP
Future'ler ve async/awaitStream TemelleriStream DenetleyicileriAsenkron YapıcılarSınıf Metotlarında AsenkronlukÖzet - Veri Getirici15Tasarım Desenleri Bölüm 2
Komut DeseniAdaptör DeseniDekoratör DeseniŞablon Metot DeseniDurum DeseniBileşik DesenDepo DeseniKendi başına pratik yap: Online Dart derleyicisi