CodeBlanks Logo Icon CodeBlanks

Meydan okuma 3

Firestore ile gerçek zamanlı sohbet ekranı yaparsın.

Meydan okuma 3 - Firestore sohbet

Bu meydan okumada Firestore koleksiyonundan mesajları snapshots() ile dinleyip StreamBuilder ile ekranda göstereceksin. Her mesaj eklenişinde stream yeni veri yayınlar.

StreamBuilder<QuerySnapshot>(
  stream: FirebaseFirestore.instance
      .collection('messages')
      .snapshots(),
  builder: (context, snapshot) {
    if (!snapshot.hasData) return Text('yukleniyor');
    return Text('${snapshot.data!.docs.length} mesaj');
  },
)

Uygulama StreamController ile ilk veri

main içinde List<String> tutan bir StreamController oluştur (streamCtrl). İçine üç elemanlı bir liste ekle. streamCtrl.stream.first ile ilk veriyi bekle ve length'ini yazdır. Sonra streamCtrl.close() çağır.

Başlangıç kodu

main.dart
import 'dart:async';

void main() async {
  // List<String> tutan bir StreamController oluştur (streamCtrl)
  // içine üç elemanlı bir liste ekle
  // stream'in ilk verisini bekle ve length'ini yazdır
}

Örnek çözüm

main.dart
import 'dart:async';

void main() async {
  final streamCtrl = StreamController<List<String>>();
  streamCtrl.add(['a', 'b', 'c']);
  final data = await streamCtrl.stream.first;
  print(data.length);
  streamCtrl.close();
}

Beklenen çıktı

3

Uygulama StreamBuilder widget'ı oluştur

main içinde List<String> tutan bir StreamController oluştur (streamCtrl). StreamBuilder<List<String>> widget'ı oluştur: stream olarak streamCtrl.stream ver, builder snapshot.hasData ise Text(snapshot.data!.length.toString()), değilse Text('yok') dönsün. Widget'ın runtimeType'ını print ile yazdır ve streamCtrl.close() çağır.

Başlangıç kodu

main.dart
import 'dart:async';
import 'package:flutter/material.dart';

void main() {
  // List<String> tutan bir StreamController oluştur (streamCtrl)
  // StreamBuilder oluştur: stream olarak streamCtrl.stream ver
  // builder snapshot hasData ise data length string, değilse 'yok'
  // widget'ın runtimeType'ını yazdır
}

Örnek çözüm

main.dart
import 'dart:async';
import 'package:flutter/material.dart';

void main() {
  final streamCtrl = StreamController<List<String>>();
  final widget = StreamBuilder<List<String>>(
    stream: streamCtrl.stream,
    builder: (context, snapshot) {
      if (snapshot.hasData) {
        return Text(snapshot.data!.length.toString());
      }
      return const Text('yok');
    },
  );
  print(widget.runtimeType);
  streamCtrl.close();
}

Beklenen çıktı

StreamBuilder<List<String>>

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 snapshots() metodu ne tür bir nesne döner?

  • Stream<QuerySnapshot> Doğru cevap
  • Future<QuerySnapshot>
  • QuerySnapshot
  • List<DocumentSnapshot>

Açıklama: snapshots() bir Stream<QuerySnapshot> döndürür; her veri değişiminde yeni snapshot yayınlanır.

2 StreamBuilder'a stream ver

Soru
StreamBuilder<QuerySnapshot>(
  stream: FirebaseFirestore.instance
      .collection('messages')
      .____(),
  builder: (context, snapshot) { ... },
)
Cevap
StreamBuilder<QuerySnapshot>(
  stream: FirebaseFirestore.instance
      .collection('messages')
      .snapshots(),
  builder: (context, snapshot) { ... },
)

Açıklama: Koleksiyon üzerinde snapshots() çağrısı gerçek zamanlı Stream<QuerySnapshot> döndürür; get ise tek seferlik Future verir.

3 Firestore sohbet eşleşmeleri

Kavram Anlamı
Firestore Veritabanı
snapshots Gerçek zamanlı akış
StreamBuilder Stream'i widget'a bağlar
QuerySnapshot Sorgu sonucu

İleri seviye bölümündeki tüm dersler