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 sözcüğü, bir Stream döndüren işlevi belirtir ve yield her değeri yayınlar. Stream'i tüketmek için, her değeri geldikçe işleyen await for ifadesini kullanın.

Ayrıca, bir geri çağırma işlevi alan listen() yöntemini kullanarak bir akışı dinleyebilirsiniz:

Stream<String> greetings() async* {
  yield 'Hello';
  yield 'Hi';
  yield 'Hey';
}

void main() {
  greetings().listen((message) {
    print(message);
  });
}

Future'lerden temel farkı: Bir Future tek bir değerle bir kez tamamlanırken Stream tamamlanmadan önce birçok değer yayımlayabilir. Bu, Stream'leri kullanıcı etkileşimleri, sensör okumaları veya parçalar hâlinde gelen veriler gibi devam eden verileri işlemek için ideal hâle getirir.

challenge icon

Görev

Kolay

Akışları kullanarak zaman içinde değerler yayan bir geri sayım zamanlayıcısı sistemi oluşturalım! Bir dizi geri sayım sayısı üreten ve akışların yalnızca bir değer yerine birden çok değeri nasıl ilettiğini gösteren bir sınıf oluşturacaksın.

Kodunu iki dosyada düzenleyeceksin:

  • countdown.dart: Geri sayım akışları üreten bir Countdown sınıfı oluştur. Sınıfında şunlar bulunmalı:
    • Geri sayımın başlangıç sayısını saklayan bir start alanı (int)
    • Başlangıç sayısını alan bir kurucu
    • Bir countDown() döndüren Stream<int> yöntemi. async* değerinden yield değerine kadar (0 dahil) sayıları yaymak için start ve 0 kullan
    • Bir countDownWithMessage() döndüren Stream<String> yöntemi. Bu yöntem, 'T-minus [number]' değerinden start değerine kadar her sayı için 1 biçiminde dizeler yaymalı, ardından son değer olarak 'Liftoff!' değerini yaymalı
  • main.dart: Geri sayım dosyanı içe aktar ve her iki akış yöntemini göster. main işlevin async olmalı ve:
    • Countdown değerinden başlayan bir 3 örneği oluştur
    • Number countdown: yazdır
    • await for üzerinde yineleme yapmak ve her sayıyı yazdırmak için countDown() kullan
    • Boş bir satır yazdır
    • Launch sequence: yazdır
    • await for üzerinde yineleme yapmak ve her mesajı yazdırmak için countDownWithMessage() kullan

Her yield ifadesinin akış üzerinden bir değer yaydığına ve await for ifadesinin her değeri gelir gelmez işlediğine dikkat et. Tek bir sonuç ileten bir Future'ın aksine, akışların birden çok değeri sırayla yayacak!

Beklenen çıktı:

Number countdown:
3
2
1
0

Launch sequence:
T-minus 3
T-minus 2
T-minus 1
Liftoff!

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

Kendi başına pratik yap: Online Dart derleyicisi