Flutter Firebase Firestore – GET

Merhabalar! Bu yazı serisinde Firebase Firestore’u Flutter uygulamalarımızda nasıl kullanacağımızı anlatacağım. Kurulum ve konfigürasyon aşaması internette birçok kaynakta bulunmakta. Bu yüzden kurulumla uğraşmayıp, fonksiyonlar ve yöntemler üzerinden kısa bir yazı serisi yazmayı planlıyorum. Bu yazıda GET metotları üzerine konuşacağız. Bir sonraki yazılar ise PUT, DELETE ve UPDATE üzerine olacak.

Kullandığımız kütüphane FlutterFire. Bu kütüphane içerisinden cloud_firestore eklentisini, Firebase ile işlem yapacağımız her .dart dosyasına eklemek durumundayız.

Bir dökümanın verilerini çekmek

Bir dökümanın verilerini almak kolay bir işlem. Öncelikle bir Firestore instance oluşturalım:

  Firestore.instance
      .collection('collectionName')
      .document('documentName')
      .get()

Firestore objemiz şu an Firebase üzerinde hangi koleksiyonda hangi dökümanı arayacağını biliyor. Peki veriyi nasıl çekeceğiz?

Firestore.instance
      .collection('collectionName')
      .document('documentName')
      .get()
      .then((DocumentSnapshot ds) async {
    CustomClass information = await postMethod(ds);
    return information;
  });

ds adıyla tanımlanan değişken bir DocumentSnapshot’tır yani Firebase tarafından size döndürülen veriyi taşıyan bir objedir. ds.data yazarak veriyi yazdırabilirsiniz. ds objesi ile documentID’yi çekebilir, var olup olmadığını (ds.exists) anlayabilir veya başka dökümanlarla karşılaştırma yapmak istiyorsanız ds.reference ile dökümanın referansını elde edebilirisiniz.

Peki verimizi aldık. Bu veri Firestore’da Map biçiminde saklanıyor ve ds.data ile elde ettiğiniz bu Map tipini parçalamanız gerekiyor ki uygulama içerisinde istediğiniz yerlerde çektiğiniz verileri kullanabilesiniz.

{
    ds.data.forEach((k,v){
      if(k == "fieldName") CustomClass.setField(v.toString());
    });
}

forEach metotunu kullanarak, ds.data’da bulunan her Map biçimindeki veriyi parçalayabiliriz. Burada k, key’leri yani veritabanınızda bulunan dökümandaki statik alanları ifade eder. v ise her döküman için değişen verimizi temsil eder. Bu yüzden “k == “fieldName”” yapısını kullanarak rahatlıkla verilerimizi objelerimize kaydedebilir, kullanılması için uygun metota döndürebiliriz.

Birden fazla dökümanın verilerini çekmek

Tek bir dökümanı Firestore üzerinde aratmak ve verilerini çekmek fazlasıyla kolay. Peki ya birden fazla dökümanı almak istiyorsanız?

  final QuerySnapshot result = await Firestore.instance
      .collection('users')
      .document('uID')
      .collection('history')
      .getDocuments();

Bunun için bir QuerySnapshot oluşturmamız gerekiyor. İstediğimiz koleksiyonun dökümanlarını bu şekilde çekebiliyoruz. Dönen sonuç result değişkeninde saklanıyor ve saklanan verinin biçimi List<Map<String, dynamic>> şeklinde oluyor. Bu veriye ulaşmak için:

  final List<DocumentSnapshot> documents = result.documents;

Yukarıdaki kodu kullanıyoruz. Bu documents isimli DocumentSnapshot tipinde verileri liste biçiminde kullanan veriyi ayıklamak için ise:

    documents.forEach((f) {
      f.forEach((k, v) {
// Map sınıfında k, key'i, v ise value'yu temsil ediyor.
      });
    });

Evet! Sonunda dönen veriyi ayıkladık ve artık forEach içerisinde istediğiniz işlemi yapabilirsiniz. 🙂

Bir sonraki yazıda görüşmek üzere!