{"id":37895,"date":"2026-01-18T00:40:51","date_gmt":"2026-01-17T21:40:51","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=37895"},"modified":"2026-01-18T00:40:51","modified_gmt":"2026-01-17T21:40:51","slug":"dart-ve-flutterda-futures-ve-streams-ile-baslangic-asenkron-programlamanin-temelleri","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/dart-ve-flutterda-futures-ve-streams-ile-baslangic-asenkron-programlamanin-temelleri\/","title":{"rendered":"Dart ve Flutter&#8217;da Futures ve Streams ile Ba\u015flang\u0131\u00e7: Asenkron Programlaman\u0131n Temelleri"},"content":{"rendered":"<p><body><\/p>\n<h2>Dart ve Flutter&#8217;da Futures ve Streams ile Ba\u015flang\u0131\u00e7: Asenkron Programlaman\u0131n Temelleri<\/h2>\n<p>Modern uygulamalar, kullan\u0131c\u0131 aray\u00fczlerinin ak\u0131c\u0131 kalmas\u0131n\u0131, arka planda veri \u00e7ekme, dosya i\u015flemleri veya karma\u015f\u0131k hesaplamalar gibi zaman al\u0131c\u0131 operasyonlar\u0131 sorunsuz bir \u015fekilde ger\u00e7ekle\u015ftirmesini gerektirir. Bu t\u00fcr senaryolarda, asenkron programlama devreye girer ve uygulaman\u0131z\u0131n &#8220;donmadan&#8221; \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. Dart ve dolay\u0131s\u0131yla Flutter, asenkron programlamay\u0131 temelden destekleyen g\u00fc\u00e7l\u00fc mekanizmalara sahiptir: Futures ve Streams. Bu makalede, Dart ve Flutter&#8217;da Futures ve Streams&#8217;in ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve uygulamalar\u0131n\u0131zda bunlar\u0131 nas\u0131l etkin bir \u015fekilde kullanabilece\u011finizi detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h3>Asenkron Programlamaya Giri\u015f<\/h3>\n<p>Asenkron programlama, \u00f6zellikle kullan\u0131c\u0131 aray\u00fcz\u00fcne sahip uygulamalar i\u00e7in hayati \u00f6neme sahiptir. Bir uygulaman\u0131n ana i\u015f par\u00e7ac\u0131\u011f\u0131 (main thread) uzun s\u00fcreli bir i\u015flemle me\u015fgul oldu\u011funda, kullan\u0131c\u0131 aray\u00fcz\u00fc donar, t\u0131klamalara yan\u0131t vermez ve k\u00f6t\u00fc bir kullan\u0131c\u0131 deneyimi sunar. Asenkron programlama bu sorunu \u00e7\u00f6zerek, zaman al\u0131c\u0131 i\u015flemleri arka plana atar ve bu i\u015flemlerin sonu\u00e7lar\u0131 haz\u0131r oldu\u011funda ana i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131 bilgilendirir.<\/p>\n<h4>Senkron ve Asenkron Fark\u0131<\/h4>\n<p>Senkron (Synchronous) programlama, kodun yukar\u0131dan a\u015fa\u011f\u0131ya do\u011fru, her bir i\u015flemin bir \u00f6ncekinin tamamlanmas\u0131n\u0131 bekleyerek \u00e7al\u0131\u015ft\u0131\u011f\u0131 bir modeldir. Bir i\u015flem tamamlanmadan di\u011ferine ge\u00e7ilemez. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-dart\">void main() {\n  print(\"\u0130\u015flem 1 ba\u015flat\u0131ld\u0131.\");\n  \/\/ Bu i\u015flem 2 saniye s\u00fcrer ve ana i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131 bloke eder.\n  Future.delayed(Duration(seconds: 2), () => print(\"Senkron i\u015flem tamamland\u0131.\")); \n  print(\"\u0130\u015flem 2 ba\u015flat\u0131ld\u0131.\"); \/\/ Bu sat\u0131r, gecikmeli i\u015flem bitmeden \u00e7al\u0131\u015fmaz.\n}<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnek asl\u0131nda bir Future kullan\u0131yor, ancak <code>await<\/code> veya <code>then<\/code> kullanmad\u0131\u011f\u0131m\u0131z i\u00e7in, <code>print(\"\u0130\u015flem 2 ba\u015flat\u0131ld\u0131.\");<\/code> hemen \u00e7al\u0131\u015facakt\u0131r. Ancak e\u011fer bu bir a\u011f iste\u011fi veya disk okuma gibi <em>ger\u00e7ekten<\/em> bloklayan bir senkron fonksiyon olsayd\u0131, <code>\u0130\u015flem 2<\/code> beklemek zorunda kal\u0131rd\u0131. Daha do\u011fru bir senkron bloklama \u00f6rne\u011fi i\u00e7in:<\/p>\n<pre><code class=\"language-dart\">import 'dart:io';\n\nvoid main() {\n  print(\"Senkron i\u015flem 1 ba\u015flat\u0131ld\u0131.\");\n  sleep(Duration(seconds: 2)); \/\/ Ana i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131 2 saniye bloke eder.\n  print(\"Senkron i\u015flem 1 tamamland\u0131.\");\n  print(\"Senkron i\u015flem 2 ba\u015flat\u0131ld\u0131.\");\n}<\/code><\/pre>\n<p>Bu kod \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda, &#8220;Senkron i\u015flem 1 ba\u015flat\u0131ld\u0131.&#8221; yaz\u0131s\u0131 g\u00f6r\u00fcn\u00fcr, ard\u0131ndan 2 saniye boyunca hi\u00e7bir \u015fey olmaz, sonra &#8220;Senkron i\u015flem 1 tamamland\u0131.&#8221; ve &#8220;Senkron i\u015flem 2 ba\u015flat\u0131ld\u0131.&#8221; yaz\u0131lar\u0131 arka arkaya g\u00f6r\u00fcn\u00fcr. Bu 2 saniyelik bekleme s\u00fcresince, bir Flutter uygulamas\u0131nda UI donmu\u015f olurdu.<\/p>\n<p>Asenkron (Asynchronous) programlama ise, bir i\u015flemin ba\u015flamas\u0131na izin verir ve bu i\u015flem tamamlanmadan di\u011fer i\u015flemlere devam eder. \u0130\u015flem tamamland\u0131\u011f\u0131nda, sonu\u00e7 bir geri \u00e7a\u011fr\u0131 (callback) fonksiyonu veya \u00f6zel bir yap\u0131 (Future, Stream) arac\u0131l\u0131\u011f\u0131yla bildirilir.<\/p>\n<pre><code class=\"language-dart\">void main() {\n  print(\"Asenkron i\u015flem 1 ba\u015flat\u0131ld\u0131.\");\n  Future.delayed(Duration(seconds: 2), () {\n    print(\"Asenkron i\u015flem 1 tamamland\u0131.\");\n  });\n  print(\"Asenkron i\u015flem 2 ba\u015flat\u0131ld\u0131.\"); \/\/ Hemen \u00e7al\u0131\u015f\u0131r\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, &#8220;Asenkron i\u015flem 1 ba\u015flat\u0131ld\u0131.&#8221; yaz\u0131s\u0131 g\u00f6r\u00fcn\u00fcr, ard\u0131ndan &#8220;Asenkron i\u015flem 2 ba\u015flat\u0131ld\u0131.&#8221; hemen g\u00f6r\u00fcn\u00fcr. 2 saniye sonra ise &#8220;Asenkron i\u015flem 1 tamamland\u0131.&#8221; yaz\u0131s\u0131 g\u00f6r\u00fcn\u00fcr. Bu, uygulaman\u0131n ana i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131n bloke edilmedi\u011fini ve kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcn ak\u0131c\u0131 kald\u0131\u011f\u0131n\u0131 g\u00f6sterir.<\/p>\n<h4>Dart&#8217;\u0131n Asenkron Modeli: Event Loop ve Isolateler<\/h4>\n<p>Dart, JavaScript gibi tek i\u015f par\u00e7ac\u0131kl\u0131 (single-threaded) bir \u00e7al\u0131\u015fma modeline sahiptir. Bu, ayn\u0131 anda yaln\u0131zca bir kod par\u00e7as\u0131n\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 anlam\u0131na gelir. Peki, tek i\u015f par\u00e7ac\u0131kl\u0131 bir ortamda asenkronluk nas\u0131l sa\u011flan\u0131r? Cevap: Event Loop (Olay D\u00f6ng\u00fcs\u00fc).<\/p>\n<p>*   <strong>Event Loop:<\/strong> Dart, ana i\u015f par\u00e7ac\u0131\u011f\u0131nda s\u00fcrekli d\u00f6nen bir &#8220;Event Loop&#8221;a sahiptir. Bu d\u00f6ng\u00fc, iki kuyru\u011fu y\u00f6netir:<br \/>\n    *   <strong>Microtask Queue:<\/strong> \u00c7ok k\u0131sa s\u00fcreli, y\u00fcksek \u00f6ncelikli g\u00f6revler i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, bir <code>Future<\/code>&#8216;\u0131n <code>.then()<\/code> metodu ile zincirlenen callback&#8217;ler buraya eklenebilir. Bu kuyruktaki t\u00fcm g\u00f6revler bitmeden, Event Queue&#8217;daki g\u00f6revlere ge\u00e7ilmez.<br \/>\n    *   <strong>Event Queue:<\/strong> Zaman al\u0131c\u0131 i\u015flemlerin (I\/O, a\u011f istekleri, zamanlay\u0131c\u0131lar, kullan\u0131c\u0131 etkile\u015fimleri) tamamlanmas\u0131ndan sonra tetiklenecek callback&#8217;ler i\u00e7in kullan\u0131l\u0131r. Bir Future tamamland\u0131\u011f\u0131nda veya bir Stream yeni bir veri g\u00f6nderdi\u011finde, ilgili callback Event Queue&#8217;ya eklenir.<\/p>\n<p>Event Loop, Microtask Queue bo\u015fald\u0131\u011f\u0131nda Event Queue&#8217;ya bakar ve s\u0131radaki g\u00f6revi al\u0131p \u00e7al\u0131\u015ft\u0131r\u0131r. Bu sayede, uzun s\u00fcreli bir i\u015flem tamamland\u0131\u011f\u0131nda, ana i\u015f par\u00e7ac\u0131\u011f\u0131 serbest kal\u0131r kalmaz ilgili callback \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r ve UI donmaz.<\/p>\n<p>*   <strong>Isolateler (Isolates):<\/strong> Dart&#8217;\u0131n tek i\u015f par\u00e7ac\u0131kl\u0131 do\u011fas\u0131 genellikle yeterli olsa da, CPU yo\u011fun hesaplamalar (\u00f6rne\u011fin, resim i\u015fleme, karma\u015f\u0131k algoritmalar) ana i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131 yine de bloke edebilir. Bu t\u00fcr durumlar i\u00e7in Dart, &#8220;Isolates&#8221; kavram\u0131n\u0131 sunar. Isolates, kendi bellek alanlar\u0131na ve kendi Event Loop&#8217;lar\u0131na sahip, birbirleriyle bellek payla\u015fmayan ba\u011f\u0131ms\u0131z i\u015f par\u00e7ac\u0131klar\u0131d\u0131r. Bir Isolate ba\u015flat\u0131ld\u0131\u011f\u0131nda, ana Isolate&#8217;ten tamamen ayr\u0131 bir ortamda \u00e7al\u0131\u015f\u0131r ve ana Isolate&#8217;i bloke etmez. \u0130leti\u015fim, mesajla\u015fma (portlar arac\u0131l\u0131\u011f\u0131yla) yoluyla sa\u011flan\u0131r. Bu makale Futures ve Streams&#8217;e odakland\u0131\u011f\u0131 i\u00e7in Isolates&#8217;e derinlemesine girmeyece\u011fiz, ancak CPU yo\u011fun g\u00f6revler i\u00e7in bir \u00e7\u00f6z\u00fcm oldu\u011funu bilmek \u00f6nemlidir.<\/p>\n<h3>Futures ile \u00c7al\u0131\u015fmak<\/h3>\n<p>Future, Dart&#8217;ta asenkron bir i\u015flemin sonucunu temsil eden bir nesnedir. Hen\u00fcz tamamlanmam\u0131\u015f bir i\u015flem i\u00e7in bir &#8220;s\u00f6z&#8221; veya &#8220;taahh\u00fct&#8221; olarak d\u00fc\u015f\u00fcnebilirsiniz. Bir Future, gelecekte bir noktada bir de\u011fer (ba\u015far\u0131l\u0131 sonu\u00e7) veya bir hata (ba\u015far\u0131s\u0131z sonu\u00e7) \u00fcretecektir.<\/p>\n<h4>Future Nedir?<\/h4>\n<p><code>Future<T><\/code> tipinde bir nesnedir; <code>T<\/code>, gelecekte elde edilecek de\u011ferin tipini belirtir. \u00d6rne\u011fin, <code>Future<String><\/code> gelecekte bir String de\u011feri, <code>Future<void><\/code> ise bir de\u011fer d\u00f6nd\u00fcrmeyen ancak tamamland\u0131\u011f\u0131n\u0131 bildiren bir i\u015flemi temsil eder.<\/p>\n<p>Bir Future&#8217;\u0131n \u00fc\u00e7 durumu vard\u0131r:<br \/>\n1.  <strong>Uncompleted (Tamamlanmam\u0131\u015f):<\/strong> \u0130\u015flem hen\u00fcz sonu\u00e7lanmam\u0131\u015f.<br \/>\n2.  <strong>Completed with a value (De\u011ferle tamamlanm\u0131\u015f):<\/strong> \u0130\u015flem ba\u015far\u0131yla tamamland\u0131 ve bir de\u011fer \u00fcretti.<br \/>\n3.  <strong>Completed with an error (Hatayla tamamlanm\u0131\u015f):<\/strong> \u0130\u015flem bir hatayla sonu\u00e7land\u0131.<\/p>\n<h4>Future Olu\u015fturma<\/h4>\n<p>Dart&#8217;ta Future olu\u015fturman\u0131n birka\u00e7 yolu vard\u0131r:<\/p>\n<p>*   <strong><code>Future.value(T value)<\/code>:<\/strong> Hemen tamamlanacak ve belirli bir de\u011feri d\u00f6nd\u00fcrecek bir Future olu\u015fturur.<\/p>\n<pre><code class=\"language-dart\">Future<String> myFuture = Future.value(\"Merhaba D\u00fcnya\");<\/code><\/pre>\n<p>*   <strong><code>Future.error(Object error)<\/code>:<\/strong> Hemen bir hatayla tamamlanacak bir Future olu\u015fturur.<\/p>\n<pre><code class=\"language-dart\">Future<void> myErrorFuture = Future.error(Exception(\"Bir hata olu\u015ftu!\"));<\/code><\/pre>\n<p>*   <strong><code>Future.delayed(Duration duration, [FutureOr<T> Function()? computation])<\/code>:<\/strong> Belirli bir s\u00fcre sonra tamamlanacak bir Future olu\u015fturur. <code>computation<\/code> iste\u011fe ba\u011fl\u0131d\u0131r.<\/p>\n<pre><code class=\"language-dart\">Future<String> delayedFuture = Future.delayed(Duration(seconds: 1), () => \"Gecikmeli veri\");<\/code><\/pre>\n<p>*   <strong><code>async<\/code> anahtar kelimesiyle fonksiyonlar:<\/strong> En yayg\u0131n ve g\u00fc\u00e7l\u00fc yoldur. Bir fonksiyonun ba\u015f\u0131na <code>async<\/code> ekledi\u011finizde, o fonksiyon otomatik olarak bir <code>Future<\/code> d\u00f6nd\u00fcr\u00fcr. Fonksiyon i\u00e7indeki <code>return<\/code> ifadesi, Future&#8217;\u0131n de\u011ferini belirler.<\/p>\n<pre><code class=\"language-dart\">Future<String> fetchData() async {\n      \/\/ A\u011f iste\u011fi, veritaban\u0131 sorgusu gibi asenkron bir i\u015flem\n      await Future.delayed(Duration(seconds: 2)); \/\/ 2 saniye bekler\n      return \"Sunucudan gelen veri\";\n    }<\/code><\/pre>\n<h4>Future&#8217;\u0131 Dinleme: <code>then<\/code>, <code>catchError<\/code>, <code>whenComplete<\/code><\/h4>\n<p>Bir Future&#8217;\u0131n sonucunu i\u015flemek i\u00e7in \u00e7e\u015fitli y\u00f6ntemler kullan\u0131r\u0131z:<\/p>\n<p>*   <strong><code>then(void Function(T value) onValue, {Function? onError})<\/code>:<\/strong> Future ba\u015far\u0131yla tamamland\u0131\u011f\u0131nda \u00e7al\u0131\u015facak geri \u00e7a\u011fr\u0131 fonksiyonunu tan\u0131mlar. Zincirleme (chaining) i\u00e7in \u00e7ok kullan\u0131\u015fl\u0131d\u0131r. \u0130ste\u011fe ba\u011fl\u0131 olarak ikinci bir <code>onError<\/code> parametresi alabilir, ancak genellikle <code>catchError<\/code> tercih edilir.<\/p>\n<pre><code class=\"language-dart\">fetchData().then((data) {\n      print(\"Veri ba\u015far\u0131yla al\u0131nd\u0131: $data\");\n    });<\/code><\/pre>\n<p>*   <strong><code>catchError(Function onError, {bool Function(Object error)? test})<\/code>:<\/strong> Future bir hatayla tamamland\u0131\u011f\u0131nda \u00e7al\u0131\u015facak geri \u00e7a\u011fr\u0131 fonksiyonunu tan\u0131mlar. <code>test<\/code> parametresi ile belirli hata tiplerini filtreleyebilirsiniz.<\/p>\n<pre><code class=\"language-dart\">Future<String> failingFetch() async {\n      await Future.delayed(Duration(seconds: 1));\n      throw Exception(\"Veri al\u0131namad\u0131!\");\n    }\n\n    failingFetch().then((data) {\n      print(\"Veri: $data\");\n    }).catchError((error) {\n      print(\"Hata olu\u015ftu: $error\");\n    });<\/code><\/pre>\n<p>*   <strong><code>whenComplete(FutureOr<void> Function() action)<\/code>:<\/strong> Future ba\u015far\u0131yla veya hatayla tamamlans\u0131n, her iki durumda da \u00e7al\u0131\u015facak geri \u00e7a\u011fr\u0131 fonksiyonunu tan\u0131mlar. Genellikle kaynaklar\u0131 serbest b\u0131rakmak veya y\u00fckleme g\u00f6stergelerini kapatmak gibi temizleme i\u015flemleri i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-dart\">fetchData().then((data) {\n      print(\"Ba\u015far\u0131l\u0131: $data\");\n    }).catchError((error) {\n      print(\"Hata: $error\");\n    }).whenComplete(() {\n      print(\"\u0130\u015flem tamamland\u0131 (ba\u015far\u0131l\u0131 veya hatal\u0131).\");\n    });<\/code><\/pre>\n<p>Bu metodlar zincirlenebilir, bu da ard\u0131\u015f\u0131k asenkron i\u015flemleri y\u00f6netmeyi kolayla\u015ft\u0131r\u0131r.<\/p>\n<pre><code class=\"language-dart\">Future<String> getUserName() async => Future.delayed(Duration(seconds: 1), () => \"Alice\");\nFuture<int> getUserAge(String name) async => Future.delayed(Duration(seconds: 1), () => name == \"Alice\" ? 30 : 0);\n\ngetUserName().then((name) {\n  print(\"Kullan\u0131c\u0131 Ad\u0131: $name\");\n  return getUserAge(name); \/\/ Bir sonraki Future'\u0131 d\u00f6nd\u00fcr\n}).then((age) {\n  print(\"Kullan\u0131c\u0131 Ya\u015f\u0131: $age\");\n}).catchError((error) {\n  print(\"Bir hata olu\u015ftu: $error\");\n});<\/code><\/pre>\n<h4><code>async<\/code> ve <code>await<\/code> ile Daha Okunabilir Kod<\/h4>\n<p><code>then<\/code>, <code>catchError<\/code> zincirleri karma\u015f\u0131kla\u015ft\u0131\u011f\u0131nda kodun okunabilirli\u011fi d\u00fc\u015febilir. Dart, <code>async<\/code> ve <code>await<\/code> anahtar kelimeleriyle bu durumu b\u00fcy\u00fck \u00f6l\u00e7\u00fcde iyile\u015ftirmi\u015ftir. Bu anahtar kelimeler, asenkron kodu senkron kod gibi yazman\u0131za olanak tan\u0131r.<\/p>\n<p>*   <strong><code>async<\/code>:<\/strong> Bir fonksiyonun asenkron oldu\u011funu ve bir <code>Future<\/code> d\u00f6nd\u00fcrece\u011fini belirtir.<br \/>\n*   <strong><code>await<\/code>:<\/strong> Yaln\u0131zca <code>async<\/code> fonksiyonlar i\u00e7inde kullan\u0131labilir. Bir <code>Future<\/code> ifadesinin \u00f6n\u00fcne konuldu\u011funda, o Future tamamlanana kadar fonksiyonun y\u00fcr\u00fct\u00fclmesini duraklat\u0131r. Future tamamland\u0131\u011f\u0131nda, <code>await<\/code> ifadesi Future&#8217;\u0131n de\u011ferini d\u00f6nd\u00fcr\u00fcr ve fonksiyon kald\u0131\u011f\u0131 yerden devam eder. Bu duraklama, ana i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131 bloke etmez; sadece mevcut <code>async<\/code> fonksiyonun y\u00fcr\u00fct\u00fclmesini ask\u0131ya al\u0131r ve Event Loop&#8217;un di\u011fer g\u00f6revleri yapmas\u0131na izin verir.<\/p>\n<pre><code class=\"language-dart\">Future<String> fetchUserData() async {\n  print(\"Veri \u00e7ekiliyor...\");\n  await Future.delayed(Duration(seconds: 2)); \/\/ 2 saniye bekler\n  return \"Kullan\u0131c\u0131 verisi\";\n}\n\nvoid main() async { \/\/ main fonksiyonu da async olabilir\n  print(\"Uygulama ba\u015flat\u0131ld\u0131.\");\n  try {\n    String data = await fetchUserData(); \/\/ fetchUserData tamamlanana kadar bekler\n    print(\"Al\u0131nan veri: $data\");\n  } catch (e) {\n    print(\"Hata olu\u015ftu: $e\");\n  }\n  print(\"Uygulama sonland\u0131.\");\n}<\/code><\/pre>\n<p>Bu kodun \u00e7\u0131kt\u0131s\u0131, <code>then<\/code> zincirleme \u00f6rne\u011findeki gibi asenkron davran\u0131r, ancak kod s\u0131ras\u0131 senkron gibi g\u00f6r\u00fcn\u00fcr:<br \/>\n&#8220;Uygulama ba\u015flat\u0131ld\u0131.&#8221;<br \/>\n&#8220;Veri \u00e7ekiliyor&#8230;&#8221;<br \/>\n(2 saniye bekleme)<br \/>\n&#8220;Al\u0131nan veri: Kullan\u0131c\u0131 verisi&#8221;<br \/>\n&#8220;Uygulama sonland\u0131.&#8221;<\/p>\n<p>Hata y\u00f6netimi <code>async<\/code>\/<code>await<\/code> ile standart <code>try-catch<\/code> bloklar\u0131 kullan\u0131larak \u00e7ok daha sezgisel hale gelir.<\/p>\n<h4>Birden Fazla Future ile \u00c7al\u0131\u015fmak<\/h4>\n<p>Bazen birden fazla asenkron i\u015flemin tamamlanmas\u0131n\u0131 beklemeniz gerekebilir. <code>Future.wait()<\/code> metodu bu senaryo i\u00e7in idealdir.<\/p>\n<p>*   <strong><code>Future.wait(Iterable<Future<T>> futures)<\/code>:<\/strong> Bir <code>Future<\/code> listesi al\u0131r ve bu listedeki t\u00fcm <code>Future<\/code>&#8216;lar tamamlanana kadar bekler. T\u00fcm <code>Future<\/code>&#8216;lar ba\u015far\u0131l\u0131 olursa, sonu\u00e7 olarak her bir <code>Future<\/code>&#8216;\u0131n de\u011ferlerinin listesini d\u00f6nd\u00fcren bir <code>Future<List<T>><\/code> d\u00f6nd\u00fcr\u00fcr. Herhangi bir <code>Future<\/code> hata verirse, <code>Future.wait<\/code> de hata verir.<\/p>\n<pre><code class=\"language-dart\">Future<String> fetchConfig() async {\n  await Future.delayed(Duration(seconds: 1));\n  return \"Uygulama Ayarlar\u0131\";\n}\n\nFuture<String> fetchMessages() async {\n  await Future.delayed(Duration(seconds: 2));\n  return \"Yeni Mesajlar\";\n}\n\nvoid main() async {\n  print(\"T\u00fcm veriler \u00e7ekiliyor...\");\n  try {\n    List<String> results = await Future.wait([\n      fetchConfig(),\n      fetchMessages(),\n      \/\/ failingFetch() \/\/ E\u011fer bu eklenirse, wait hata verir\n    ]);\n    print(\"T\u00fcm veriler ba\u015far\u0131yla \u00e7ekildi: $results\");\n  } catch (e) {\n    print(\"Veri \u00e7ekme s\u0131ras\u0131nda bir hata olu\u015ftu: $e\");\n  }\n  print(\"Uygulama devam ediyor.\");\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>fetchConfig<\/code> 1 saniye, <code>fetchMessages<\/code> 2 saniye s\u00fcrse de, <code>Future.wait<\/code> en uzun s\u00fcren Future kadar bekler, yani 2 saniye sonra her iki veri de al\u0131nm\u0131\u015f olur.<\/p>\n<h3>Streams ile \u00c7al\u0131\u015fmak<\/h3>\n<p>Future, tek bir asenkron olay\u0131n sonucunu temsil ederken, Stream, zaman i\u00e7inde birden fazla asenkron olay\u0131n (veri veya hata) bir dizisini temsil eder. Bir Stream, veri ak\u0131\u015f\u0131, olay ak\u0131\u015f\u0131 veya s\u00fcrekli g\u00fcncellemeler i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h4>Stream Nedir?<\/h4>\n<p><code>Stream<T><\/code> tipinde bir nesnedir; <code>T<\/code>, ak\u0131\u015ftan gelen her bir olay\u0131n tipini belirtir. \u00d6rne\u011fin, bir <code>Stream<int><\/code> zaman i\u00e7inde birden fazla tam say\u0131 de\u011feri sa\u011flayabilir.<\/p>\n<p>Stream&#8217;ler iki ana kategoriye ayr\u0131l\u0131r:<br \/>\n1.  <strong>Single-subscription Streams (Tek Abonelikli Ak\u0131\u015flar):<\/strong> Bir Stream&#8217;in yaln\u0131zca bir dinleyicisi olabilir. Dinleyici iptal edildikten sonra (veya Stream sona erdikten sonra), tekrar dinlenemez. Genellikle dosya okuma, HTTP istekleri gibi bir kerelik veri ak\u0131\u015flar\u0131 i\u00e7in kullan\u0131l\u0131r.<br \/>\n2.  <strong>Broadcast Streams (Yay\u0131n Ak\u0131\u015flar\u0131):<\/strong> Birden fazla dinleyicisi olabilir. Dinleyiciler Stream&#8217;e istedikleri zaman abone olabilir ve aboneliklerini iptal edebilirler. Kullan\u0131c\u0131 aray\u00fcz\u00fc olaylar\u0131 (t\u0131klamalar, kayd\u0131rmalar), veri taban\u0131 de\u011fi\u015fiklikleri gibi s\u00fcrekli olaylar i\u00e7in kullan\u0131l\u0131r. <code>StreamController.broadcast()<\/code> ile olu\u015fturulurlar.<\/p>\n<h4>Stream Olu\u015fturma<\/h4>\n<p>Stream olu\u015fturman\u0131n birka\u00e7 yolu vard\u0131r:<\/p>\n<p><em>   <strong><code>async<\/em><\/code> Generator Fonksiyonlar\u0131:<\/strong> <code>async<\/code> fonksiyonlar <code>Future<\/code> d\u00f6nd\u00fcr\u00fcrken, <code>async*<\/code> fonksiyonlar <code>Stream<\/code> d\u00f6nd\u00fcr\u00fcr. <code>yield<\/code> anahtar kelimesi ile Stream&#8217;e de\u011ferler g\u00f6nderilir.<\/p>\n<pre><code class=\"language-dart\">Stream<int> countStream(int max) async* {\n      for (int i = 1; i <= max; i++) {\n        await Future.delayed(Duration(seconds: 1));\n        yield i; \/\/ Stream'e bir de\u011fer g\u00f6nderir\n      }\n    }<\/code><\/pre>\n<p>*   <strong><code>StreamController<\/code>:<\/strong> Daha karma\u015f\u0131k senaryolarda, Stream'i programatik olarak kontrol etmek i\u00e7in <code>StreamController<\/code> kullan\u0131l\u0131r. Bu, Stream'e veri eklemenizi (<code>add<\/code>), hata eklemenizi (<code>addError<\/code>) ve Stream'i kapatman\u0131z\u0131 (<code>close<\/code>) sa\u011flar.<\/p>\n<pre><code class=\"language-dart\">import 'dart:async';\n\n    StreamController<String> myController = StreamController<String>();\n\n    void addDataToStream() {\n      myController.add(\"\u0130lk veri\");\n      Future.delayed(Duration(seconds: 1), () => myController.add(\"\u0130kinci veri\"));\n      Future.delayed(Duration(seconds: 2), () => myController.addError(\"Bir hata!\"));\n      Future.delayed(Duration(seconds: 3), () => myController.add(\"\u00dc\u00e7\u00fcnc\u00fc veri\"));\n      Future.delayed(Duration(seconds: 4), () => myController.close()); \/\/ Stream'i kapat\u0131r\n    }<\/code><\/pre>\n<p>*   <strong>Di\u011fer Olu\u015fturucular:<\/strong><br \/>\n    *   <code>Stream.fromIterable(Iterable<T> iterable)<\/code>: Bir Iterable'dan (Liste, Set vb.) bir Stream olu\u015fturur.<br \/>\n    *   <code>Stream.periodic(Duration period, [T Function(int computationCount)? callback])<\/code>: Belirli aral\u0131klarla de\u011fer \u00fcreten bir Stream olu\u015fturur.<\/p>\n<pre><code class=\"language-dart\">Stream<int> numbers = Stream.fromIterable([1, 2, 3, 4, 5]);\n    Stream<int> countdown = Stream.periodic(Duration(seconds: 1), (i) => 5 - i).take(6);<\/code><\/pre>\n<h4>Stream'i Dinleme: <code>listen<\/code>, <code>onData<\/code>, <code>onError<\/code>, <code>onDone<\/code>, <code>cancel<\/code><\/h4>\n<p>Bir Stream'den gelen verileri i\u015flemek i\u00e7in <code>listen()<\/code> metodunu kullan\u0131r\u0131z. <code>listen()<\/code> metodu bir <code>StreamSubscription<\/code> nesnesi d\u00f6nd\u00fcr\u00fcr, bu da Stream'i kontrol etmenizi sa\u011flar.<\/p>\n<pre><code class=\"language-dart\">void main() {\n  Stream<int> myStream = countStream(3); \/\/ countStream'den gelen verileri dinle\n\n  StreamSubscription<int> subscription = myStream.listen(\n    (data) {\n      print(\"Gelen veri: $data\"); \/\/ Her yeni veri geldi\u011finde \u00e7al\u0131\u015f\u0131r\n    },\n    onError: (error) {\n      print(\"Stream hatas\u0131: $error\"); \/\/ Bir hata olu\u015ftu\u011funda \u00e7al\u0131\u015f\u0131r\n    },\n    onDone: () {\n      print(\"Stream tamamland\u0131.\"); \/\/ Stream kapand\u0131\u011f\u0131nda \u00e7al\u0131\u015f\u0131r\n    },\n    cancelOnError: false, \/\/ Hata durumunda aboneli\u011fi iptal etme\n  );\n\n  \/\/ Belirli bir s\u00fcre sonra aboneli\u011fi iptal etme (iste\u011fe ba\u011fl\u0131)\n  Future.delayed(Duration(seconds: 2), () {\n    print(\"Abonelik iptal ediliyor...\");\n    subscription.cancel();\n  });\n}<\/code><\/pre>\n<p>*   <strong><code>onData<\/code>:<\/strong> Stream'den yeni bir veri geldi\u011finde \u00e7a\u011fr\u0131l\u0131r.<br \/>\n*   <strong><code>onError<\/code>:<\/strong> Stream'de bir hata olu\u015ftu\u011funda \u00e7a\u011fr\u0131l\u0131r.<br \/>\n*   <strong><code>onDone<\/code>:<\/strong> Stream kapand\u0131\u011f\u0131nda (art\u0131k veri g\u00f6ndermeyecekse) \u00e7a\u011fr\u0131l\u0131r.<br \/>\n*   <strong><code>cancelOnError<\/code>:<\/strong> <code>true<\/code> ise, bir hata olu\u015ftu\u011funda abonelik otomatik olarak iptal edilir. <code>false<\/code> ise, hatalar olsa bile Stream veri g\u00f6ndermeye devam edebilir (e\u011fer Stream kapat\u0131lmazsa).<br \/>\n*   <strong><code>subscription.cancel()<\/code>:<\/strong> Bir StreamSubscription nesnesi \u00fczerinden aboneli\u011fi manuel olarak iptal etmenizi sa\u011flar. Bu, \u00f6zellikle kaynak s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nlemek i\u00e7in \u00f6nemlidir (\u00f6rne\u011fin, bir widget ekrandan kald\u0131r\u0131ld\u0131\u011f\u0131nda Stream dinlemeyi durdurmak).<\/p>\n<h4>Stream D\u00f6n\u00fc\u015f\u00fcmleri<\/h4>\n<p>Iterable'larda oldu\u011fu gibi, Stream'ler \u00fczerinde de bir\u00e7ok d\u00f6n\u00fc\u015f\u00fcm (transformation) i\u015flemi yapabilirsiniz. Bu metodlar yeni bir Stream d\u00f6nd\u00fcr\u00fcr ve orijinal Stream'i de\u011fi\u015ftirmez.<\/p>\n<p>*   <strong><code>map<R>(R Function(T event) convert)<\/code>:<\/strong> Her bir olay\u0131 d\u00f6n\u00fc\u015ft\u00fcr\u00fcr ve yeni bir Stream<R> olu\u015fturur.<\/p>\n<pre><code class=\"language-dart\">numbers.map((n) => n * 2).listen(print); \/\/ \u00c7\u0131kt\u0131: 2, 4, 6, 8, 10<\/code><\/pre>\n<p>*   <strong><code>where(bool Function(T event) test)<\/code>:<\/strong> Belirli bir ko\u015fulu kar\u015f\u0131layan olaylar\u0131 filtreler.<\/p>\n<pre><code class=\"language-dart\">numbers.where((n) => n.isEven).listen(print); \/\/ \u00c7\u0131kt\u0131: 2, 4<\/code><\/pre>\n<p>*   <strong><code>take(int count)<\/code>:<\/strong> Stream'den sadece ilk <code>count<\/code> kadar olay\u0131 al\u0131r ve sonra Stream'i kapat\u0131r.<\/p>\n<pre><code class=\"language-dart\">countdown.take(3).listen(print); \/\/ \u00c7\u0131kt\u0131: 5, 4, 3<\/code><\/pre>\n<p>*   <strong><code>skip(int count)<\/code>:<\/strong> Stream'den ilk <code>count<\/code> kadar olay\u0131 atlar.<\/p>\n<pre><code class=\"language-dart\">countdown.skip(3).listen(print); \/\/ \u00c7\u0131kt\u0131: 2, 1, 0<\/code><\/pre>\n<p>*   <strong><code>distinct()<\/code>:<\/strong> Arka arkaya gelen ayn\u0131 de\u011ferleri filtreler.<\/p>\n<pre><code class=\"language-dart\">Stream.fromIterable([1, 1, 2, 3, 3, 3, 4]).distinct().listen(print); \/\/ \u00c7\u0131kt\u0131: 1, 2, 3, 4<\/code><\/pre>\n<p>*   <strong><code>expand<R>(Iterable<R> Function(T element) convert)<\/code>:<\/strong> Her bir olay\u0131 s\u0131f\u0131r veya daha fazla olaya geni\u015fletir.<\/p>\n<pre><code class=\"language-dart\">Stream.fromIterable([\"A\", \"B\"]).expand((char) => [char, char.toLowerCase()]).listen(print); \/\/ \u00c7\u0131kt\u0131: A, a, B, b<\/code><\/pre>\n<p>*   <strong><code>fold<R>(R initialValue, R Function(R previous, T element) combine)<\/code>:<\/strong> Stream'deki t\u00fcm de\u011ferleri tek bir de\u011fere indirger (birle\u015ftirir).<\/p>\n<pre><code class=\"language-dart\">numbers.fold(0, (prev, element) => prev + element).then(print); \/\/ \u00c7\u0131kt\u0131: 15<\/code><\/pre>\n<p>*   <strong><code>reduce(T Function(T previous, T element) combine)<\/code>:<\/strong> <code>fold<\/code>'a benzer, ancak ba\u015flang\u0131\u00e7 de\u011feri almaz ve ilk eleman\u0131 ba\u015flang\u0131\u00e7 olarak kullan\u0131r.<\/p>\n<pre><code class=\"language-dart\">numbers.reduce((prev, element) => prev + element).then(print); \/\/ \u00c7\u0131kt\u0131: 15<\/code><\/pre>\n<h4><code>await for<\/code> ile Stream Dinleme<\/h4>\n<p><code>async<\/code> fonksiyonlar i\u00e7inde Stream'leri t\u00fcketmek i\u00e7in <code>await for<\/code> d\u00f6ng\u00fcs\u00fc kullan\u0131labilir. Bu, Stream'i dinlemeyi senkron bir d\u00f6ng\u00fc gibi g\u00f6sterir ve kodu daha okunabilir hale getirir.<\/p>\n<pre><code class=\"language-dart\">Future<void> processStream() async {\n  Stream<int> myNumbers = countStream(3);\n  print(\"Stream i\u015fleniyor...\");\n  await for (int number in myNumbers) {\n    print(\"\u0130\u015flenen say\u0131: $number\");\n  }\n  print(\"Stream i\u015fleme tamamland\u0131.\");\n}\n\nvoid main() {\n  processStream();\n}<\/code><\/pre>\n<p>\u00c7\u0131kt\u0131:<br \/>\n\"Stream i\u015fleniyor...\"<br \/>\n(1 saniye) \"\u0130\u015flenen say\u0131: 1\"<br \/>\n(1 saniye) \"\u0130\u015flenen say\u0131: 2\"<br \/>\n(1 saniye) \"\u0130\u015flenen say\u0131: 3\"<br \/>\n\"Stream i\u015fleme tamamland\u0131.\"<\/p>\n<p><code>await for<\/code> d\u00f6ng\u00fcs\u00fc, Stream'den yeni bir de\u011fer gelene kadar bekler, de\u011feri i\u015fler ve ard\u0131ndan bir sonraki de\u011feri bekler. Stream kapand\u0131\u011f\u0131nda d\u00f6ng\u00fc otomatik olarak sona erer.<\/p>\n<h4>StreamController ve Broadcast Streams<\/h4>\n<p><code>StreamController<\/code> manuel olarak Stream'e veri, hata ve tamamlama olaylar\u0131 eklemek i\u00e7in kullan\u0131l\u0131r. E\u011fer birden fazla dinleyiciniz olacaksa, <code>StreamController.broadcast()<\/code> kullanmal\u0131s\u0131n\u0131z.<\/p>\n<pre><code class=\"language-dart\">import 'dart:async';\n\nvoid main() {\n  \/\/ Tek abonelikli bir StreamController\n  \/\/ StreamController<int> controller = StreamController<int>();\n\n  \/\/ Birden fazla aboneli\u011fe izin veren bir StreamController\n  StreamController<int> controller = StreamController<int>.broadcast();\n\n  \/\/ \u0130lk dinleyici\n  StreamSubscription sub1 = controller.stream.listen((data) {\n    print(\"Dinleyici 1: $data\");\n  }, onError: (e) => print(\"Dinleyici 1 Hata: $e\"));\n\n  \/\/ \u0130kinci dinleyici (sadece broadcast stream'lerde \u00e7al\u0131\u015f\u0131r)\n  StreamSubscription? sub2;\n  Future.delayed(Duration(milliseconds: 500), () {\n    sub2 = controller.stream.listen((data) {\n      print(\"Dinleyici 2: $data\");\n    }, onError: (e) => print(\"Dinleyici 2 Hata: $e\"));\n  });\n\n  controller.add(1);\n  Future.delayed(Duration(seconds: 1), () => controller.add(2));\n  Future.delayed(Duration(seconds: 2), () => controller.addError(\"Bir hata!\"));\n  Future.delayed(Duration(seconds: 3), () => controller.add(3));\n  Future.delayed(Duration(seconds: 4), () {\n    controller.close(); \/\/ Stream'i kapat\n    sub1.cancel(); \/\/ Kaynak s\u0131z\u0131nt\u0131s\u0131n\u0131 \u00f6nlemek i\u00e7in abonelikleri iptal et\n    sub2?.cancel();\n  });\n}<\/code><\/pre>\n<p><code>StreamController<\/code>'\u0131 kullan\u0131rken, i\u015finiz bitti\u011finde <code>controller.close()<\/code> metodunu \u00e7a\u011f\u0131rarak kaynaklar\u0131 serbest b\u0131rakmay\u0131 unutmay\u0131n. Aksi takdirde bellek s\u0131z\u0131nt\u0131lar\u0131 ya\u015fanabilir.<\/p>\n<h3>Flutter'da Futures ve Streams Kullan\u0131m\u0131<\/h3>\n<p>Flutter, asenkron verileri kullan\u0131c\u0131 aray\u00fcz\u00fcnde g\u00f6stermek i\u00e7in \u00f6zel widget'lar sunar: <code>FutureBuilder<\/code> ve <code>StreamBuilder<\/code>. Bu widget'lar, asenkron i\u015flemlerin durumuna (y\u00fckleniyor, veri geldi, hata olu\u015ftu) g\u00f6re UI'y\u0131 dinamik olarak g\u00fcncellemeyi kolayla\u015ft\u0131r\u0131r.<\/p>\n<h4>UI G\u00fcncellemeleri i\u00e7in Futures: <code>FutureBuilder<\/code><\/h4>\n<p><code>FutureBuilder<\/code> widget'\u0131, bir <code>Future<\/code>'\u0131n sonucuna g\u00f6re UI'n\u0131z\u0131 yeniden olu\u015fturman\u0131za olanak tan\u0131r. \u00d6zellikle bir kerelik veri \u00e7ekme (API \u00e7a\u011fr\u0131lar\u0131, veritaban\u0131 sorgular\u0131) ve bu veriyi ekranda g\u00f6sterme senaryolar\u0131 i\u00e7in idealdir.<\/p>\n<pre><code class=\"language-dart\">import 'package:flutter\/material.dart';\n\nclass FutureBuilderExample extends StatefulWidget {\n  @override\n  _FutureBuilderExampleState createState() => _FutureBuilderExampleState();\n}\n\nclass _FutureBuilderExampleState extends State<FutureBuilderExample> {\n  late Future<String> _data;\n\n  @override\n  void initState() {\n    super.initState();\n    _data = _fetchData(); \/\/ Future'\u0131 bir kez ba\u015flat\n  }\n\n  Future<String> _fetchData() async {\n    await Future.delayed(Duration(seconds: 3));\n    \/\/ throw Exception(\"Veri \u00e7ekilemedi!\"); \/\/ Hata senaryosu i\u00e7in\n    return \"Sunucudan gelen harika veri!\";\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(title: Text(\"FutureBuilder \u00d6rne\u011fi\")),\n      body: Center(\n        child: FutureBuilder<String>(\n          future: _data, \/\/ \u0130zlenecek Future\n          builder: (BuildContext context, AsyncSnapshot<String> snapshot) {\n            if (snapshot.connectionState == ConnectionState.waiting) {\n              return CircularProgressIndicator(); \/\/ Y\u00fckleniyor durumu\n            } else if (snapshot.hasError) {\n              return Text('Hata: ${snapshot.error}'); \/\/ Hata durumu\n            } else if (snapshot.hasData) {\n              return Text('Veri: ${snapshot.data}'); \/\/ Veri geldi durumu\n            } else {\n              return Text('Veri yok'); \/\/ Varsay\u0131lan durum (nadiren g\u00f6r\u00fcl\u00fcr)\n            }\n          },\n        ),\n      ),\n    );\n  }\n}<\/code><\/pre>\n<p><code>AsyncSnapshot<\/code> nesnesi, <code>Future<\/code>'\u0131n mevcut durumu (ba\u011flant\u0131 durumu, veri, hata) hakk\u0131nda bilgi sa\u011flar.<\/p>\n<h4>UI G\u00fcncellemeleri i\u00e7in Streams: <code>StreamBuilder<\/code><\/h4>\n<p><code>StreamBuilder<\/code> widget'\u0131, bir <code>Stream<\/code>'den gelen yeni verilere g\u00f6re UI'n\u0131z\u0131 dinamik olarak yeniden olu\u015fturman\u0131za olanak tan\u0131r. Ger\u00e7ek zamanl\u0131 g\u00fcncellemeler, geri say\u0131m saya\u00e7lar\u0131, sohbet uygulamalar\u0131 veya sens\u00f6r verileri gibi s\u00fcrekli de\u011fi\u015fen veriler i\u00e7in idealdir.<\/p>\n<pre><code class=\"language-dart\">import 'package:flutter\/material.dart';\n\nclass StreamBuilderExample extends StatefulWidget {\n  @override\n  _StreamBuilderExampleState createState() => _StreamBuilderExampleState();\n}\n\nclass _StreamBuilderExampleState extends State<StreamBuilderExample> {\n  late Stream<int> _countdownStream;\n\n  @override\n  void initState() {\n    super.initState();\n    _countdownStream = _createCountdownStream(5);\n  }\n\n  Stream<int> _createCountdownStream(int count) async* {\n    for (int i = count; i >= 0; i--) {\n      await Future.delayed(Duration(seconds: 1));\n      yield i;\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(title: Text(\"StreamBuilder \u00d6rne\u011fi\")),\n      body: Center(\n        child: StreamBuilder<int>(\n          stream: _countdownStream, \/\/ \u0130zlenecek Stream\n          builder: (BuildContext context, AsyncSnapshot<int> snapshot) {\n            if (snapshot.connectionState == ConnectionState.waiting) {\n              return Text('Geri say\u0131m ba\u015fl\u0131yor...');\n            } else if (snapshot.hasError) {\n              return Text('Hata: ${snapshot.error}');\n            } else if (snapshot.hasData) {\n              return Text('Kalan s\u00fcre: ${snapshot.data}', style: TextStyle(fontSize: 48));\n            } else {\n              return Text('Geri say\u0131m tamamland\u0131!');\n            }\n          },\n        ),\n      ),\n    );\n  }\n}<\/code><\/pre>\n<p><code>StreamBuilder<\/code> da <code>FutureBuilder<\/code> gibi bir <code>AsyncSnapshot<\/code> kullan\u0131r, ancak bu sefer snapshot, Stream'den gelen en son veriyi temsil eder.<\/p>\n<h4>BLoC\/Cubit Mimarilerinde Stream Kullan\u0131m\u0131<\/h4>\n<p>Flutter'da durum y\u00f6netimi (state management) i\u00e7in pop\u00fcler mimarilerden olan BLoC (Business Logic Component) ve Cubit, b\u00fcy\u00fck \u00f6l\u00e7\u00fcde Stream'ler \u00fczerine kuruludur. BLoC\/Cubit, UI'dan gelen olaylar\u0131 (input) bir <code>Sink<\/code> arac\u0131l\u0131\u011f\u0131yla al\u0131r, i\u015f mant\u0131\u011f\u0131n\u0131 uygular ve ard\u0131ndan g\u00fcncellenmi\u015f durumu (output) bir <code>Stream<\/code> arac\u0131l\u0131\u011f\u0131yla UI'ya g\u00f6nderir. <code>StreamBuilder<\/code> veya <code>BlocBuilder<\/code>\/<code>CubitBuilder<\/code> gibi widget'lar bu Stream'leri dinleyerek UI'y\u0131 otomatik olarak g\u00fcnceller. Bu, uygulaman\u0131z\u0131n durumunu izole etmenize, test edilebilirli\u011fi art\u0131rman\u0131za ve UI'\u0131 i\u015f mant\u0131\u011f\u0131ndan ay\u0131rman\u0131za yard\u0131mc\u0131 olur.<\/p>\n<h3>\u0130yi Uygulamalar ve \u0130pu\u00e7lar\u0131<\/h3>\n<p>*   <strong>Hata Y\u00f6netimi:<\/strong> Asenkron kodda hata y\u00f6netimi kritiktir. Futures i\u00e7in <code>try-catch<\/code> bloklar\u0131n\u0131 <code>async<\/code>\/<code>await<\/code> ile veya <code>catchError<\/code> metodunu kullan\u0131n. Stream'ler i\u00e7in <code>listen<\/code> metodunun <code>onError<\/code> callback'ini kullan\u0131n. Hatalar\u0131 uygun \u015fekilde loglamak ve kullan\u0131c\u0131ya bildirmek \u00f6nemlidir.<br \/>\n*   <strong>Kaynaklar\u0131 Kapatma:<\/strong> \u00d6zellikle <code>StreamController<\/code> veya <code>StreamSubscription<\/code> kullan\u0131yorsan\u0131z, i\u015finiz bitti\u011finde bunlar\u0131 kapatmay\u0131 veya iptal etmeyi unutmay\u0131n (<code>controller.close()<\/code>, <code>subscription.cancel()<\/code>). Bu, bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 ve gereksiz i\u015flem y\u00fck\u00fcn\u00fc \u00f6nler. Flutter'da <code>StatefulWidget<\/code> kullan\u0131rken, <code>initState<\/code> i\u00e7inde olu\u015fturulan abonelikleri <code>dispose<\/code> metodunda iptal etmek iyi bir uygulamad\u0131r.<br \/>\n*   <strong>UI Donmalar\u0131n\u0131 \u00d6nleme:<\/strong> Uzun s\u00fcreli ve CPU yo\u011fun hesaplamalar ana i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131 bloke edebilir. Bu t\u00fcr i\u015flemleri bir <code>Isolate<\/code> i\u00e7inde \u00e7al\u0131\u015ft\u0131rmay\u0131 d\u00fc\u015f\u00fcn\u00fcn. A\u011f istekleri ve dosya I\/O gibi I\/O yo\u011fun i\u015flemler zaten asenkron oldu\u011fu i\u00e7in genellikle ana i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131 bloke etmezler.<br \/>\n*   <strong>Okunabilirlik:<\/strong> M\u00fcmk\u00fcn oldu\u011funca <code>async<\/code>\/<code>await<\/code> kullanmaya \u00e7al\u0131\u015f\u0131n, \u00e7\u00fcnk\u00fc kodu senkron gibi g\u00f6stererek okunabilirli\u011fi ve anla\u015f\u0131labilirli\u011fi art\u0131r\u0131r. Karma\u015f\u0131k <code>then<\/code> zincirleri yerine <code>try-catch<\/code> ile hata y\u00f6netimi de daha kolayd\u0131r.<br \/>\n*   <strong>Test Edilebilirlik:<\/strong> Asenkron kodun testlerini yazmak biraz farkl\u0131l\u0131k g\u00f6sterir. <code>test<\/code> paketindeki <code>expectLater<\/code> veya <code>pumpAndSettle<\/code> gibi ara\u00e7lar\u0131 kullanarak asenkron i\u015flemlerin sonu\u00e7lar\u0131n\u0131 ve zamanlamalar\u0131n\u0131 do\u011fru bir \u015fekilde test edebilirsiniz.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Dart ve Flutter'da Futures ve Streams, asenkron programlaman\u0131n temel ta\u015flar\u0131d\u0131r. Futures, tek bir asenkron i\u015flemin sonucunu y\u00f6netirken, Streams zaman i\u00e7indeki olay dizilerini y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc bir mekanizma sunar. <code>async<\/code>\/<code>await<\/code> anahtar kelimeleri kodu daha okunabilir hale getirirken, <code>FutureBuilder<\/code> ve <code>StreamBuilder<\/code> gibi Flutter widget'lar\u0131, asenkron verileri kullan\u0131c\u0131 aray\u00fcz\u00fcnde dinamik olarak g\u00f6r\u00fcnt\u00fclemeyi son derece kolayla\u015ft\u0131r\u0131r.<\/p>\n<p>Bu ara\u00e7lar\u0131 etkin bir \u015fekilde kullanarak, h\u0131zl\u0131 yan\u0131t veren, ak\u0131c\u0131 ve \u00f6l\u00e7eklenebilir Dart ve Flutter uygulamalar\u0131 geli\u015ftirebilirsiniz. Asenkron programlaman\u0131n inceliklerini anlamak ve bu yap\u0131lar\u0131 do\u011fru bir \u015fekilde uygulamak, modern uygulama geli\u015ftirme becerilerinizin vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r. Bu makale, Futures ve Streams d\u00fcnyas\u0131na sa\u011flam bir ba\u015flang\u0131\u00e7 yapman\u0131z i\u00e7in gerekli temel bilgileri ve \u00f6rnekleri sunmaktad\u0131r. \u015eimdi bu bilgileri kendi projelerinizde uygulayarak deneyim kazanma zaman\u0131!<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Dart ve Flutter&#8217;da Futures ve Streams ile Ba\u015flang\u0131\u00e7: Asenkron Programlaman\u0131n Temelleri\nModern uygulamalar, kullan\u0131c\u0131 aray\u00fczlerinin ak\u0131c\u0131 kal","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1492],"tags":[],"class_list":{"0":"post-37895","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-flutter","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Dart ve Flutter&#039;da Futures ve Streams ile Ba\u015flang\u0131\u00e7: Asenkron Programlaman\u0131n Temelleri - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/dart-ve-flutterda-futures-ve-streams-ile-baslangic-asenkron-programlamanin-temelleri\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dart ve Flutter&#039;da Futures ve Streams ile Ba\u015flang\u0131\u00e7: Asenkron Programlaman\u0131n Temelleri\" \/>\n<meta property=\"og:description\" content=\"Dart ve Flutter&#039;da Futures ve Streams ile Ba\u015flang\u0131\u00e7: Asenkron Programlaman\u0131n Temelleri Modern uygulamalar, kullan\u0131c\u0131 aray\u00fczlerinin ak\u0131c\u0131 kal\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/dart-ve-flutterda-futures-ve-streams-ile-baslangic-asenkron-programlamanin-temelleri\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-17T21:40:51+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dart-ve-flutterda-futures-ve-streams-ile-baslangic-asenkron-programlamanin-temelleri\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dart-ve-flutterda-futures-ve-streams-ile-baslangic-asenkron-programlamanin-temelleri\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Dart ve Flutter&#8217;da Futures ve Streams ile Ba\u015flang\u0131\u00e7: Asenkron Programlaman\u0131n Temelleri\",\"datePublished\":\"2026-01-17T21:40:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dart-ve-flutterda-futures-ve-streams-ile-baslangic-asenkron-programlamanin-temelleri\/\"},\"wordCount\":2686,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Flutter\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/dart-ve-flutterda-futures-ve-streams-ile-baslangic-asenkron-programlamanin-temelleri\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dart-ve-flutterda-futures-ve-streams-ile-baslangic-asenkron-programlamanin-temelleri\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/dart-ve-flutterda-futures-ve-streams-ile-baslangic-asenkron-programlamanin-temelleri\/\",\"name\":\"Dart ve Flutter'da Futures ve Streams ile Ba\u015flang\u0131\u00e7: Asenkron Programlaman\u0131n Temelleri - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-17T21:40:51+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dart-ve-flutterda-futures-ve-streams-ile-baslangic-asenkron-programlamanin-temelleri\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/dart-ve-flutterda-futures-ve-streams-ile-baslangic-asenkron-programlamanin-temelleri\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dart-ve-flutterda-futures-ve-streams-ile-baslangic-asenkron-programlamanin-temelleri\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dart ve Flutter&#8217;da Futures ve Streams ile Ba\u015flang\u0131\u00e7: Asenkron Programlaman\u0131n Temelleri\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Dart ve Flutter'da Futures ve Streams ile Ba\u015flang\u0131\u00e7: Asenkron Programlaman\u0131n Temelleri - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/dart-ve-flutterda-futures-ve-streams-ile-baslangic-asenkron-programlamanin-temelleri\/","og_locale":"tr_TR","og_type":"article","og_title":"Dart ve Flutter'da Futures ve Streams ile Ba\u015flang\u0131\u00e7: Asenkron Programlaman\u0131n Temelleri","og_description":"Dart ve Flutter'da Futures ve Streams ile Ba\u015flang\u0131\u00e7: Asenkron Programlaman\u0131n Temelleri Modern uygulamalar, kullan\u0131c\u0131 aray\u00fczlerinin ak\u0131c\u0131 kal","og_url":"https:\/\/fatihsoysal.com\/blog\/dart-ve-flutterda-futures-ve-streams-ile-baslangic-asenkron-programlamanin-temelleri\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-17T21:40:51+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"19 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/dart-ve-flutterda-futures-ve-streams-ile-baslangic-asenkron-programlamanin-temelleri\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/dart-ve-flutterda-futures-ve-streams-ile-baslangic-asenkron-programlamanin-temelleri\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Dart ve Flutter&#8217;da Futures ve Streams ile Ba\u015flang\u0131\u00e7: Asenkron Programlaman\u0131n Temelleri","datePublished":"2026-01-17T21:40:51+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/dart-ve-flutterda-futures-ve-streams-ile-baslangic-asenkron-programlamanin-temelleri\/"},"wordCount":2686,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Flutter"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/dart-ve-flutterda-futures-ve-streams-ile-baslangic-asenkron-programlamanin-temelleri\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/dart-ve-flutterda-futures-ve-streams-ile-baslangic-asenkron-programlamanin-temelleri\/","url":"https:\/\/fatihsoysal.com\/blog\/dart-ve-flutterda-futures-ve-streams-ile-baslangic-asenkron-programlamanin-temelleri\/","name":"Dart ve Flutter'da Futures ve Streams ile Ba\u015flang\u0131\u00e7: Asenkron Programlaman\u0131n Temelleri - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-17T21:40:51+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/dart-ve-flutterda-futures-ve-streams-ile-baslangic-asenkron-programlamanin-temelleri\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/dart-ve-flutterda-futures-ve-streams-ile-baslangic-asenkron-programlamanin-temelleri\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/dart-ve-flutterda-futures-ve-streams-ile-baslangic-asenkron-programlamanin-temelleri\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Dart ve Flutter&#8217;da Futures ve Streams ile Ba\u015flang\u0131\u00e7: Asenkron Programlaman\u0131n Temelleri"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37895","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=37895"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37895\/revisions"}],"predecessor-version":[{"id":37896,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37895\/revisions\/37896"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=37895"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=37895"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=37895"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}