Sitemap

Flutterda Asenkron programlama: Future, Async, Await

3 min readMar 9, 2025

--

Press enter or click to view image in full size

Yaptığım uygulamalar üzerinden öğrendiğim şeyleri yazdığım 3. Medium yazıma hoşgeldiniz!☺️

Bu sefer bir hava durumu uygulaması yaptım (uygulamanın kodlarına github adresimden ulaşabilirisiniz.) ve ilk defa bir projemde API kullanarak webden canlı veri çektim. Bu yazımda da Future, async ve await kavramlarıyla birlikte API işlemlerinde bolca kullanılan asenkron programlamayı anlatacağım. Öyleyse Future ile başlayalım!

Future

Birçok programlama dilinde kullanılan Future nesnesi bir işin henüz bitmediğini ancak gelecekte tamamlanacağını belirtir. Future nesnesiyle senkron programlamada gecikme işlemleri yapabilirsiniz ancak Future anahtar kelimesi denince akla direkt asenkron programlama gelir. İlk olarak senkron programlama örneği verelim.

void main() {
gorev1();
gorev2();
gorev3();
}
void gorev1() {
String sonuc = 'gorev 1 in verisi';
print('1. gorev tamamlandı');
}
//gorev2 nin 3 sn sonra çalışmasını istiyoruz
void gorev2() {
Future.delayed(Duration(seconds: 3), (){
String sonuc = 'gorev 2 nin verisi';
print('2. gorev tamamlandı');
});
}
void gorev3() {
String sonuc = 'gorev 3 un verisi';
print('3. gorev tamamlandı');
}

kodun çıktısı:

1. gorev tamamlandı
3. gorev tamamlandı
2. gorev tamamlandı

Bu kodda gorev2 nin çalışmasını 3 sn geciktirdik. Normalde gorev3 un gorev2 den sonra çalışması gerekir ama biz gorev2 de Future kullandığımız için gorev2 nin sonuçlanması beklenmeden gorev3 ü çalıştırabildik.

Get Dilara Kardaş’s stories in your inbox

Join Medium for free to get updates from this writer.

Bu kod Future ın senkron programlamadaki kullanımına basit bir örnekti. Şimdi diyelim ki gorev3 un çalışması için gorev2 nin çıktısına ihtiyacı var. Böyle bir senaryoyla karşılaştığımızda ne yapmalıyız?

void main() {
gorev1();
String gorev2ninSonucu = gorev2();
gorev3(gorev2ninSonucu);
}

void gorev1() {
String sonuc = 'gorev 1 in verisi';
print('1. gorev tamamlandı');
}

String gorev2() {
String sonuc="...";

Future.delayed(Duration(seconds: 3), (){
sonuc= 'gorev 2 nin verisi';
print('2. gorev tamamlandı');
});
return sonuc;
}

void gorev3(String task2Data) {
String sonuc = 'gorev 3 ün verisi';
print('3. gorev, $task2Data ile tamamlandı ');
}

kodun çıktısı:

1. gorev tamamlandı
3. gorev, ... ile tamamlandı
2. gorev tamamlandı

Bu kodu çalıştırdığımız zaman hata almayız. Ancak gorev3 null değer döndürür. Çünkü bu kod gorev2 nin çalışması bitmeden gorev3 ü çalıştırır. Future kullanmamıza rağmen planladığımız senaryoyu hala uygulamaya dökemedik. Çünkü gorev2 ve gorev3 eş zamanlı çalışmıyor yani asenkron çalışıyor. Ancak biz hala kodu senkron yazmaya çalışıyoruz. Öyleyse kodu asenkron hale getirelim.

void main() async{
gorev1();
String gorev2ninSonucu = await gorev2();
gorev3(gorev2ninSonucu);
}

void gorev1() {
String sonuc = 'gorev 1 in verisi';
print('1. gorev tamamlandı');
}

Future<String> gorev2() async{
String sonuc="";

await Future.delayed(Duration(seconds: 3), (){
sonuc = 'gorev 2 nin verisi';
print('2. gorev tamamlandı');
});
return sonuc;
}

void gorev3(String gorev2ninVerisi) {
String sonuc = 'gorev 3 ün verisi';
print('3. gorev, $gorev2ninVerisi ile tamamlandı ');
}

Kodun çıktısı:

1. gorev tamamlandı
2. gorev tamamlandı
3. gorev, gorev 2 nin verisi ile tamamlandı

Kodda ilgili yerlere async ve await anahtar kelimelerini yerleştirerek kodu asenkron hale getirdik.

async bir fonksiyonun asenkron olduğunu belirtir. await ise asenkron fonksiyon içinde kullanılarak o fonksiyonda beklemesi gereken işlem için kullanılır. async olmadan await kullanamazsınız ancak await olmadan async kullanılabilir, sadece o kodun beklediği bir şey olmaz.

Dart dilinde async Future döndürür. Ki bu da çok mantıklı çünkü sonuçta asenkron çalışan bir fonksiyonun diğer fonksiyonlarla eşzamanlı sonuçlanmayacağını biliyoruz dolayısıyla async tanımlı fonksiyon dile gelse “Ben birazdan sonuçlanacağım. Yani şimdi değil. O yüzden beni Future tanımlamalısın” derdi. ☺️

Basit bir örnekle Future ı anlattım. Peki Future nerelerde kullanılır derseniz, HTTP istekleri, dosya işlemleri ve veri tabanı sorguları gibi uzun süren (zaman gerektiren) işlemlerde kullanılır.

Günlük Hayattan Bir Örnek

Ve tüm bu anlattıklarımın somutlaşması için günlük hayattan bir örnek verecek olursam, Future bir fast food restoranında yemek siparişi vermek gibidir. Şöyle ki sipariş verdiğinizde size siparişinizin detaylarıyla birlikte sıra numaranızın yazılı olduğu bir fiş verirler. Bu fiş yemeğinizin hazırlanmaya başladığını ve bir süre sonra o yemeği alacağınızı gösterir. Yemeğiniz hazırlandığı esnada arkadaşınızla sohbet etmek ya da sosyal medyada gezinti yapmak gibi farklı işlerle meşgul olabilirsiniz. İşte kodlamada Future tam olarak böyle çalışır. Bir fonksiyonu Future tanımladıktan sonra onun sonuçlanmasını beklemeden başka fonksiyonlarla meşgul olabilirsiniz.

Umarım faydalı bir yazı olmuştur. Geri bildirim vermek isterseniz bana linkedin adresimden ulaşabilirsiniz. ☺️

--

--