CodeBlanks Logo Icon CodeBlanks

Özet - Firestore

add, snapshots ve where'i birleştirerek sohbet ekranı yaparsın.

Sohbet ekranı

Bir sohbet ekranı add, snapshots ve where'i birleştirir. Yeni mesaj add ile eklenir, mevcut mesajlar snapshots ile gerçek zamanlı dinlenir ve belirli bir kullanıcıya ait mesajlar where ile filtrelenebilir. Veri değiştiğinde akış otomatik güncellenir.

await db.collection('messages').add({
  'text': msg,
  'sender': 'Ali',
});
db.collection('messages').snapshots().listen((snap) {
  for (final doc in snap.docs) {
    print(doc.data()['text']);
  }
});

Uygulama Sohbet akışı yaz

Db al. Önce 'messages' koleksiyonuna {'text': 'Merhaba', 'sender': 'Ali'} verisiyle belge ekle. Sonra where('sender', isEqualTo: 'Ali') ile filtrele ve snapshots akışını dinle. Her snapshot'ta ilk belgenin text alanını yazdır. 10 milisaniye bekle.

Başlangıç kodu

main.dart
class QueryDocumentSnapshot {
  final Map<String, dynamic> data;
  QueryDocumentSnapshot(this.data);
}

class QuerySnapshot {
  final List<QueryDocumentSnapshot> docs;
  QuerySnapshot(this.docs);
}

class DocumentReference {
  final String id;
  DocumentReference(this.id);
}

class Query {
  final List<QueryDocumentSnapshot> docs;
  Query(this.docs);
  Stream<QuerySnapshot> snapshots() async* {
    yield QuerySnapshot(docs);
  }
}

class CollectionReference {
  final String name;
  final List<Map<String, dynamic>> _store;
  CollectionReference(this.name, this._store);

  Future<DocumentReference> add(Map<String, dynamic> data) async {
    _store.add(data);
    return DocumentReference('auto-${_store.length}');
  }

  Query where(String field, {required String isEqualTo}) {
    final filtered = _store
      .where((m) => m[field] == isEqualTo)
      .map((m) => QueryDocumentSnapshot(m))
      .toList();
    return Query(filtered);
  }
}

class FirebaseFirestore {
  static final FirebaseFirestore instance = FirebaseFirestore._();
  FirebaseFirestore._();
  final Map<String, List<Map<String, dynamic>>> _db = {};

  CollectionReference collection(String name) {
    _db.putIfAbsent(name, () => []);
    return CollectionReference(name, _db[name]!);
  }
}

void main() async {
  // belge ekle
  // where ile filtrele, snapshots dinle
  // her snapshot'ta ilk belgenin text alanını yazdır
}

Örnek çözüm

main.dart
class QueryDocumentSnapshot {
  final Map<String, dynamic> data;
  QueryDocumentSnapshot(this.data);
}

class QuerySnapshot {
  final List<QueryDocumentSnapshot> docs;
  QuerySnapshot(this.docs);
}

class DocumentReference {
  final String id;
  DocumentReference(this.id);
}

class Query {
  final List<QueryDocumentSnapshot> docs;
  Query(this.docs);
  Stream<QuerySnapshot> snapshots() async* {
    yield QuerySnapshot(docs);
  }
}

class CollectionReference {
  final String name;
  final List<Map<String, dynamic>> _store;
  CollectionReference(this.name, this._store);

  Future<DocumentReference> add(Map<String, dynamic> data) async {
    _store.add(data);
    return DocumentReference('auto-${_store.length}');
  }

  Query where(String field, {required String isEqualTo}) {
    final filtered = _store
      .where((m) => m[field] == isEqualTo)
      .map((m) => QueryDocumentSnapshot(m))
      .toList();
    return Query(filtered);
  }
}

class FirebaseFirestore {
  static final FirebaseFirestore instance = FirebaseFirestore._();
  FirebaseFirestore._();
  final Map<String, List<Map<String, dynamic>>> _db = {};

  CollectionReference collection(String name) {
    _db.putIfAbsent(name, () => []);
    return CollectionReference(name, _db[name]!);
  }
}

void main() async {
  final db = FirebaseFirestore.instance;
  await db.collection('messages').add({
    'text': 'Merhaba',
    'sender': 'Ali',
  });
  db.collection('messages')
    .where('sender', isEqualTo: 'Ali')
    .snapshots()
    .listen((snap) {
      print(snap.docs.first.data()['text']);
    });
  await Future.delayed(Duration(milliseconds: 10));
}

Beklenen çıktı

Merhaba

Soru ve cevaplar

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

1 Sohbet ekranında yeni mesaj eklendiğinde liste nasıl güncellenir?

  • snapshots akışı otomatik yeni snapshot yayar Doğru cevap
  • Manuel olarak get çağrılır
  • Liste hiç güncellenmez
  • Uygulama yeniden başlatılır

Açıklama: snapshots gerçek zamanlı bir akış olduğu için veri eklendiğinde otomatik yeni snapshot yayılır; manuel get gerekmez.

2 Mesaj ekle

Soru
await db.collection('messages').____({
  'text': 'Merhaba',
  'sender': 'Ali',
});
Cevap
await db.collection('messages').add({
  'text': 'Merhaba',
  'sender': 'Ali',
});

Açıklama: Sohbet ekranında yeni mesaj eklemek için add metodu kullanılır; mesaj verisi Map olarak verilir.

3 Sohbet ekranı parçaları

Kavram Anlamı
add Mesaj ekler
snapshots Mesajları dinler
where Gönderene göre filtreler
doc.data()['text'] Mesaj metni

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