DART- Senkron/Asenkron İşlemler

AbdullahTaş
3 min readNov 23, 2020

DART- Senkron/Asenkron İşlemler

DART-Senkron/Asenkron İşlemler adlı yazımla kaldığımız yerden devam ediyoruz.

Senkron ve asenkron işlemlere geçmeden önce bu kavramları açıklamak istiyorum.

SENKRON: Program içerisinde bir işlem yapılırken, bu işlem bitmeden ikinci bir işleme geçilemez. Bu yapıya Senkron denir.

ASENKRON:Senkron yapısının tam tersi. Yani arka planda bir işlem yapılırken başka bir işleme geçebilen yapıdır.

Şimdi gelin örnek bir yapıya hepberaber bakalım

void main(){
siparisHazirla();
}
siparisHazirla(){
return Future.delayed(Duration(seconds:4),()=>"Siparisiniz alindi");
}

Örneğimizde siparisHazirla adında bir fonksiyon oluşturduk. Bu fonksiyon string tipinde değer döndüren bir fonksiyon. Ancak burada gözümüze çarpan bazı kavramlar da var. İlk önce o kavramları açıklayalım.

Future:Kelime anlamı olarak gelecek,sözleşme gibi anlamları vardır. Henüz tamamlanmamış veya tamamlanacak işlemleri temsil eder. Bu kavramı başka bir yazıda çok kısa şekilde özetleyeceğim.

Delayed:Kelime anlamı olarak geçikmiş anlamına gelir. Bu metot iki adet parametre alır.

  1. Duration: Metotun gecikme veya bekletme süresi. Gün,saat,dakika,saniye ve milisaniye tipinde değer alır.
  2. Anonim Fonksiyon: Anonim fonksiyon konusu bir önceki yazımız. Eğer bu konu hakkında bilginiz yoksa buraya tıklayarak konu hakkında bilgi sahibi olabilirsiniz. Fonksiyon almasının nedeni süre dolduğunda yapacağı işlemi bildirmek.

Bu kodları hızlıca inceleyelim.

  • Siparishazirla adlı fonksiyon asenkron bir fonksiyon.
  • String tipinde bir veri döndürüyor.
  • Ve son olarak bu veriyi döndermeden önce 4 saniyelik bir bekletme işlemi yapıyor.

Kavramları ve hızlı bir şekilde kodları açıkladık. Artık biliyoruz ki bu kod bloğu asenkron bir yapıda. Kod bloğunu bu şekilde alıp editörünüzde çalıştırmaya çalışırsanız ekrana herhangi bir sonuç gelmez. Çünkü daha yapacağımız işlemler var.

Kod bloğumuzu biraz daha düzenleyelim ve editörlermizde o şekilde çalıştırmaya çalışalım.

void main(){
siparisVer();
}
siparisVer(){
var siparisDurumu=siparisHazirla();
print("Siparis Durumu: $siparisDurumu");
}
siparisHazirla(){
return Future.delayed(Duration(seconds:4),()=>"Siparisiniz alindi");
}

Hemen burada ne yaptığımızı kodlarımızı nasıl güncellediğimizi açıklayalım.

Siparishazirla adında ve asenkron yapıda bir fonksiyonumuz mevcuttu. Bu fonksiyonumuz bir string döndürüyor ancak döndürmeden önce 4 saniye bekletiyordu.

  • Bu fonksiyonun üst kısmında Siparisver adında yeni bir fonksiyon yarattık.
  • Bu fonksiyonun içerisinde siparisdurumu adlı bir değişken oluşturup
  • Bu değişkene de siparishazirla adlı fonksiyonumuzu atadık.
  • Son olarakta main bloğu içerisinde siparisver adlı fonksiyonumuzu çağırdık.

Bu kodları kod editörümüzde çalıştırdığımız zaman “Siparis Durumu: Instance of ‘_Future<String>” diye bir hata alacağız. Bu hata bize siparishazirla adlı fonksiyonumuzun string tipinde bir future döndürdüğünden bahsediyor. Yani burada tamamlanmamış bir işlem olduğunu bize hatırlatıyor. Ancak siparisver adlı fonksiyonumuz senkron bir yapıda olduğu için siparishazirla fonksiyonunun 4 saniyeyi tamamlamasını beklemeden çalışıyor ve bizde bu hata ile karşılaşıyoruz.

Yeri gelmişken future kavramını çok kısa, özet diyebileceğimiz şekilde açıkladığım yazıya buraya tıklayarak ulaşabilirsiniz

Gelelim bu hatayı düzeltmeye.

Sadece asenkron yapılarda kullandığımız iki kavramla sizi tanıştırmak isterim; async ve await. Async sadece asenkron yapılarda çalışır. Async kavramının olmadığı yerde await kavramı kullanılamaz. Async, kullanıldığı fonksiyonu geciktirir. Hemen değil bir kaç saniye,dakika veya saat sonra işlem yapmasına izin verir.

Örneğimizde ki hatayı düzeltmeden önce konunun iyice anlaşılması adına lütfen future kavramı adlı yazımı okuyun.

void main() {
print(siparisVer());
}
Future<String>siparisVer() async {
var siparisDurumu= await siparisHazirla();
return "SİPARİS DURUMU: $siparisDurumu";
}
Future<String>siparisHazirla(){
return Future.delayed(Duration(seconds:4),()=>"SİPARİSİNİZ HAZIRLANIYOR");
}

Neler yaptık bakalım;

  • Delayed metodu 4 saniye sonra tamamlanacak ve bize bir Future<String> döndürecek.
  • siparisHazirla fonksiyonu delayedden dönen Future<String> yapısını dönderecek
  • siparisVer içerisinde await kullanarak Future<String> yapısının tamamlanmasını bekleyeceğiz.
  • Bu bekleme işlemi bittiğinde ise dönen String türünü siparisDurumu değişkenine kaydediyoruz.
  • Future<String> String tipinde değer döndükleri için fonksiyonların başına geldi.

DİKKAT: Bu kodları editörümüzde çalıştırdığımız zaman aynı hatayı tekrar aldığımızı göreceksiniz. Bunun sebebi main bloğunun senkron bir yapıda olmasından kaynaklı. Kodlarımı aşağıdaki gibi düzeltince 4 saniye sonra bize siparisDurumumuzu belirten bir yazı ekrana çıkacaktır.

Future<void> main()async {
print(await siparisVer());
}
Future<String>siparisVer() async {
var siparisDurumu= await siparisHazirla();
return "SİPARİS DURUMU: $siparisDurumu";
}
Future<String>siparisHazirla(){
return Future.delayed(Duration(seconds:4),()=>"SİPARİSİNİZ HAZIRLANIYOR");
}

Evet bir yazımızın daha sonuna geldik. Umarım burada anlatılanların size faydası olur.Eksik veya hatalı içerik için lütfen tarafıma bildiride bulunun.

İyi çalışmalar :)

Benim ve yazılarım hakkında daha fazlası için => www.abdullahtas.net

Yararlanılan kaynaklar:

https://www.udemy.com/course/flutter-dart-sifirdan-mobil-app-gelistiriciligine/

--

--

AbdullahTaş

Bilgisayar Programıcısı-AÖF Yönetim Bilişim Sistemleri/DART&FLUTTER