Stream Temelleri
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 77 / 110.
Bir Future tek bir değer sunarken, bir Stream zaman içinde bir değerler dizisi sunar. Bunu, birden fazla veri parçası yayabilen bir boru gibi düşünün; olaylar, gerçek zamanlı güncellemeler veya verileri parça parça işlemek için mükemmeldir.
Stream.fromIterable() kullanarak veya async* ve yield ile bir asenkron üreteç fonksiyonu kullanarak basit bir akış oluşturabilirsiniz:
Stream<int> countToThree() async* {
yield 1;
yield 2;
yield 3;
}
Future<void> main() async {
await for (var number in countToThree()) {
print(number);
}
}
// Çıktı: 1, 2, 3async* anahtar kelimesi, bir Stream döndüren bir fonksiyonu işaretler ve yield her bir değeri yayar. Akışı tüketmek için, her bir değeri ulaştığı anda işleyen await for yapısını kullanın.
Bir akışı (stream), bir geri çağırma (callback) fonksiyonu alan listen() metodunu kullanarak da dinleyebilirsiniz:
Stream<String> greetings() async* {
yield 'Hello';
yield 'Hi';
yield 'Hey';
}
void main() {
greetings().listen((message) {
print(message);
});
}Futures'dan temel farkı: bir Future tek bir değerle bir kez tamamlanırken, bir Stream tamamlanmadan önce birçok değer yayabilir. Bu, Stream'leri kullanıcı etkileşimleri, sensör okumaları veya parçalar halinde gelen veriler gibi devam eden verileri işlemek için ideal hale getirir.
Görev
KolayStream'leri kullanarak zaman içinde değerler yayan bir geri sayım sayacı sistemi oluşturalım! Stream'lerin tek bir değer yerine birden fazla değeri nasıl ilettiğini gösteren, bir dizi geri sayım numarası üreten bir sınıf oluşturacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
countdown.dart: Geri sayım stream'leri üreten birCountdownsınıfı oluşturun. Sınıfınız şunlara sahip olmalıdır:- Geri sayım için başlangıç sayısını saklayan bir
startalanı (int) - Başlangıç sayısını alan bir yapıcı (constructor)
Stream<int>döndüren bircountDown()metodu.startdeğerinden0değerine kadar (dahil) sayıları yaymak içinasync*veyieldkullanınStream<String>döndüren bircountDownWithMessage()metodu. Bu metod,startdeğerinden1'e kadar olan her sayı için'T-minus [number]'formatında dizeler yaymalı, ardından son değer olarak'Liftoff!'yaymalıdır
- Geri sayım için başlangıç sayısını saklayan bir
main.dart: Geri sayım dosyanızı içe aktarın (import) ve her iki stream metodunu da gösterin. main fonksiyonunuz async olmalı ve şunları yapmalıdır:3'ten başlayan birCountdownörneği oluşturunNumber countdown:yazdırıncountDown()üzerinde yineleme yapmak ve her sayıyı yazdırmak içinawait forkullanın- Boş bir satır yazdırın
Launch sequence:yazdırıncountDownWithMessage()üzerinde yineleme yapmak ve her mesajı yazdırmak içinawait forkullanın
Her yield ifadesinin stream aracılığıyla nasıl bir değer yaydığına ve await for ifadesinin her değeri ulaştığı anda nasıl işlediğine dikkat edin. Tek bir sonuç sunan bir Future'ın aksine, stream'leriniz sırayla birden fazla değer yayacaktır!
Beklenen çıktı:
Number countdown:
3
2
1
0
Launch sequence:
T-minus 3
T-minus 2
T-minus 1
Liftoff!Kopya kağıdı
Bir Stream, tek bir değer döndüren Future'ın aksine, zaman içinde bir dizi değer sunar. Stream'ler olaylar, gerçek zamanlı güncellemeler veya verileri parça parça işlemek için idealdir.
async* ve yield kullanarak bir asenkron üreteç (generator) fonksiyonu ile bir stream oluşturun:
Stream<int> countToThree() async* {
yield 1;
yield 2;
yield 3;
}Bir stream'i await for kullanarak tüketin:
Future<void> main() async {
await for (var number in countToThree()) {
print(number);
}
}Alternatif olarak, bir geri çağırma (callback) fonksiyonu ile listen() metodunu kullanın:
void main() {
greetings().listen((message) {
print(message);
});
}Ayrıca Stream.fromIterable() kullanarak bir iterable nesnesinden de stream oluşturabilirsiniz.
Kendin dene
import 'countdown.dart';
Future<void> main() async {
// TODO: 3'ten başlayan bir Countdown örneği oluşturun
// TODO: 'Number countdown:' yazdırın
// TODO: countDown() üzerinden yineleme yapmak ve her sayıyı yazdırmak için await for kullanın
// TODO: Boş bir satır yazdırın
// TODO: 'Launch sequence:' yazdırın
// TODO: countDownWithMessage() üzerinden yineleme yapmak ve her mesajı yazdırmak için await for kullanı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ı