Menu
Coddy logo textTech

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, 3

async* 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.

challenge icon

Görev

Kolay

Stream'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 bir Countdown sı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 start alanı (int)
    • Başlangıç sayısını alan bir yapıcı (constructor)
    • Stream<int> döndüren bir countDown() metodu. start değerinden 0 değerine kadar (dahil) sayıları yaymak için async* ve yield kullanın
    • Stream<String> döndüren bir countDownWithMessage() metodu. Bu metod, start değerinden 1'e kadar olan her sayı için 'T-minus [number]' formatında dizeler yaymalı, ardından son değer olarak 'Liftoff!' yaymalıdır
  • 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 bir Countdown örneği oluşturun
    • Number countdown: yazdırın
    • countDown() üzerinde yineleme yapmak ve her sayıyı yazdırmak için await for kullanın
    • Boş bir satır yazdırın
    • Launch sequence: yazdırın
    • countDownWithMessage() üzerinde yineleme yapmak ve her mesajı yazdırmak için await for kullanı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
}
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