Özet - Firestore
- Flutter kursu
- İleri seviye
- Ders 25/69
- 4 dk
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
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
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
await db.collection('messages').____({
'text': 'Merhaba',
'sender': 'Ali',
});
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 |