{"id":34165,"date":"2025-11-12T04:40:55","date_gmt":"2025-11-12T01:40:55","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=34165"},"modified":"2025-11-12T04:40:55","modified_gmt":"2025-11-12T01:40:55","slug":"flutterda-widgetlar-arasi-iletisim-voidcallback-ve-functiont-kullanimi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/flutterda-widgetlar-arasi-iletisim-voidcallback-ve-functiont-kullanimi\/","title":{"rendered":"Flutter&#8217;da Widget&#8217;lar Aras\u0131 \u0130leti\u015fim: VoidCallback ve Function(T) Kullan\u0131m\u0131"},"content":{"rendered":"<p><body><\/p>\n<h2>Flutter&#8217;da Widget&#8217;lar Aras\u0131 \u0130leti\u015fim: VoidCallback ve Function(T) Kullan\u0131m\u0131<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>Flutter, Google taraf\u0131ndan geli\u015ftirilen, tek kod taban\u0131yla mobil, web ve masa\u00fcst\u00fc uygulamalar\u0131 olu\u015fturmaya olanak tan\u0131yan bir UI toolkit&#8217;idir. Flutter&#8217;\u0131n temel yap\u0131 ta\u015f\u0131 &#8220;widget&#8221;lard\u0131r. Her \u015fey bir widget&#8217;t\u0131r ve uygulamalar, bu widget&#8217;lar\u0131n i\u00e7 i\u00e7e ge\u00e7mi\u015f bir a\u011fac\u0131 olarak in\u015fa edilir. Bu widget a\u011fac\u0131nda, \u00e7o\u011fu zaman alt widget&#8217;lar\u0131n \u00fcst widget&#8217;larla veya karde\u015f widget&#8217;larla ileti\u015fim kurmas\u0131, veri al\u0131\u015fveri\u015finde bulunmas\u0131 veya belirli olaylar\u0131 bildirmesi gerekir. Flutter&#8217;da widget&#8217;lar aras\u0131 ileti\u015fim, uygulaman\u0131n dinamik ve etkile\u015fimli olmas\u0131n\u0131 sa\u011flayan kritik bir konudur.<\/p>\n<p>Bu makalede, Flutter&#8217;da widget&#8217;lar aras\u0131 ileti\u015fimin en temel ve yayg\u0131n kullan\u0131lan y\u00f6ntemlerinden ikisi olan <code>VoidCallback<\/code> ve <code>Function(T)<\/code> yap\u0131lar\u0131n\u0131 derinlemesine inceleyece\u011fiz. Bu mekanizmalar, \u00f6zellikle alt widget&#8217;lardan \u00fcst widget&#8217;lara olay bildirimleri veya veri aktar\u0131m\u0131 i\u00e7in kullan\u0131l\u0131r. Her bir yap\u0131n\u0131n ne oldu\u011funu, nas\u0131l kullan\u0131ld\u0131\u011f\u0131n\u0131, hangi senaryolarda tercih edilmesi gerekti\u011fini kapsaml\u0131 kod \u00f6rnekleriyle a\u00e7\u0131klayacak, aralar\u0131ndaki farklar\u0131 ortaya koyacak ve en iyi uygulama y\u00f6ntemlerini tart\u0131\u015faca\u011f\u0131z.<\/p>\n<h3>Flutter&#8217;da Widget \u0130leti\u015fiminin \u00d6nemi<\/h3>\n<p>Flutter&#8217;\u0131n deklaratif (bildirimsel) UI yap\u0131s\u0131nda, kullan\u0131c\u0131 aray\u00fcz\u00fc uygulaman\u0131n mevcut durumunun bir fonksiyonudur. Durum (state) de\u011fi\u015fti\u011finde, Flutter otomatik olarak UI&#8217;\u0131 yeniden \u00e7izer. Ancak bu durumun y\u00f6netimi ve g\u00fcncellenmesi, widget&#8217;lar aras\u0131 ileti\u015fimi gerektirir. \u00d6rne\u011fin:<br \/>\n*   Bir kullan\u0131c\u0131 bir butona t\u0131klad\u0131\u011f\u0131nda, bu t\u0131klama olay\u0131n\u0131n \u00fcst widget&#8217;a bildirilmesi ve \u00fcst widget&#8217;\u0131n durumunu g\u00fcncellemesi gerekebilir.<br \/>\n*   Bir metin giri\u015f alan\u0131na (TextField) yaz\u0131lan metnin, bu alan\u0131 i\u00e7eren \u00fcst widget taraf\u0131ndan okunmas\u0131 ve i\u015flenmesi gerekebilir.<br \/>\n*   Bir listeden bir \u00f6\u011fe se\u00e7ildi\u011finde, se\u00e7ilen \u00f6\u011fenin verilerinin bir \u00fcst widget&#8217;a iletilmesi ve onun taraf\u0131ndan g\u00f6r\u00fcnt\u00fclenmesi veya ba\u015fka bir i\u015flem i\u00e7in kullan\u0131lmas\u0131 gerekebilir.<\/p>\n<p>Bu senaryolar, widget&#8217;lar aras\u0131 ileti\u015fimin ne kadar merkezi bir rol oynad\u0131\u011f\u0131n\u0131 g\u00f6stermektedir. Flutter&#8217;da bu t\u00fcr basit ileti\u015fimler i\u00e7in genellikle &#8220;callback&#8221; (geri \u00e7a\u011f\u0131rma) fonksiyonlar\u0131 kullan\u0131l\u0131r. Callback&#8217;ler, bir widget&#8217;\u0131n belirli bir olay meydana geldi\u011finde \u00e7a\u011fr\u0131lmak \u00fczere ba\u015fka bir widget&#8217;a ge\u00e7irdi\u011fi fonksiyonlard\u0131r.<\/p>\n<h3>VoidCallback Nedir?<\/h3>\n<p><code>VoidCallback<\/code>, Flutter&#8217;da ve genel olarak Dart&#8217;ta s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan, belirli bir fonksiyon tipini temsil eden bir typedef&#8217;dir. Tan\u0131m olarak, <code>VoidCallback<\/code> hi\u00e7bir arg\u00fcman almayan ve hi\u00e7bir de\u011fer d\u00f6nd\u00fcrmeyen bir fonksiyondur.<\/p>\n<p><strong>Tan\u0131m ve Ama\u00e7:<\/strong><br \/>\n<code>VoidCallback<\/code>&#8216;in temel amac\u0131, bir alt widget&#8217;tan bir \u00fcst widget&#8217;a sadece bir olay\u0131n meydana geldi\u011fini bildirmektir. Bu olayla ilgili herhangi bir veri ta\u015f\u0131nmas\u0131na gerek olmad\u0131\u011f\u0131nda idealdir. \u00d6rne\u011fin, bir butonun t\u0131kland\u0131\u011f\u0131n\u0131, bir animasyonun bitti\u011fini veya bir i\u015flemin tamamland\u0131\u011f\u0131n\u0131 bildirmek i\u00e7in kullan\u0131labilir.<\/p>\n<p><strong>S\u00f6zdizimi:<\/strong><br \/>\nDart&#8217;ta bir <code>VoidCallback<\/code> \u015fu \u015fekilde tan\u0131mlanabilir:<\/p>\n<pre><code class=\"language-dart\">typedef VoidCallback = void Function();<\/code><\/pre>\n<p>Bu, &#8220;hi\u00e7bir arg\u00fcman almayan ve <code>void<\/code> (hi\u00e7bir \u015fey) d\u00f6nd\u00fcren bir fonksiyon&#8221; anlam\u0131na gelir. Bir <code>VoidCallback<\/code> de\u011fi\u015fkeni veya parametresi tan\u0131mlarken bu typedef&#8217;i kullanabilirsiniz:<\/p>\n<pre><code class=\"language-dart\">VoidCallback myCallback = () {\n  print('Callback \u00e7a\u011fr\u0131ld\u0131!');\n};\n\n\/\/ Veya bir widget'\u0131n parametresi olarak:\nclass MyButton extends StatelessWidget {\n  final VoidCallback onPressed;\n\n  const MyButton({Key? key, required this.onPressed}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return ElevatedButton(\n      onPressed: onPressed, \/\/ D\u0131\u015far\u0131dan gelen callback'i kullan\n      child: const Text('Bana T\u0131kla'),\n    );\n  }\n}<\/code><\/pre>\n<p><strong>VoidCallback Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/strong><br \/>\n1.  <strong>\u00dcst Widget Tan\u0131mlar:<\/strong> \u00dcst (parent) widget, bir olaya tepki vermek i\u00e7in bir fonksiyon tan\u0131mlar.<br \/>\n2.  <strong>\u00dcst Widget Ge\u00e7irir:<\/strong> \u00dcst widget, bu fonksiyonu alt (child) widget&#8217;\u0131na bir parametre olarak ge\u00e7irir.<br \/>\n3.  <strong>Alt Widget \u00c7a\u011f\u0131r\u0131r:<\/strong> Alt widget, ilgili olay meydana geldi\u011finde (\u00f6rne\u011fin, bir butona bas\u0131ld\u0131\u011f\u0131nda) kendisine ge\u00e7irilen bu fonksiyonu \u00e7a\u011f\u0131r\u0131r.<br \/>\n4.  <strong>\u00dcst Widget Tepki Verir:<\/strong> Callback \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, \u00fcst widget&#8217;taki tan\u0131ml\u0131 fonksiyon \u00e7al\u0131\u015f\u0131r ve bu sayede \u00fcst widget durumu g\u00fcncelleyebilir veya ba\u015fka bir i\u015flem yapabilir.<\/p>\n<p><strong>Basit \u00d6rnek: Buton T\u0131klamas\u0131<\/strong><br \/>\nBir <code>StatelessWidget<\/code> olan <code>MyChildButton<\/code>&#8216;\u0131n, t\u0131kland\u0131\u011f\u0131nda <code>ParentWidget<\/code>&#8216;a haber vermesi i\u00e7in <code>VoidCallback<\/code> kullan\u0131m\u0131:<\/p>\n<pre><code class=\"language-dart\">\/\/ main.dart\nimport 'package:flutter\/material.dart';\n\nvoid main() {\n  runApp(const MyApp());\n}\n\nclass MyApp extends StatelessWidget {\n  const MyApp({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      title: 'VoidCallback \u00d6rne\u011fi',\n      theme: ThemeData(\n        primarySwatch: Colors.blue,\n      ),\n      home: const ParentWidget(),\n    );\n  }\n}\n\n\/\/ \u00dcst Widget\nclass ParentWidget extends StatefulWidget {\n  const ParentWidget({Key? key}) : super(key: key);\n\n  @override\n  State<ParentWidget> createState() => _ParentWidgetState();\n}\n\nclass _ParentWidgetState extends State<ParentWidget> {\n  String _message = 'Hen\u00fcz bir butona t\u0131klanmad\u0131.';\n\n  \/\/ Alt widget'tan gelecek olay\u0131 dinleyecek fonksiyon\n  void _handleButtonPressed() {\n    setState(() {\n      _message = 'Butona t\u0131kland\u0131!';\n    });\n    print('ParentWidget: Buton t\u0131klama olay\u0131 al\u0131nd\u0131.');\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text('VoidCallback \u00d6rne\u011fi'),\n      ),\n      body: Center(\n        child: Column(\n          mainAxisAlignment: MainAxisAlignment.center,\n          children: <Widget>[\n            Text(\n              _message,\n              style: const TextStyle(fontSize: 20),\n            ),\n            const SizedBox(height: 20),\n            \/\/ Alt widget'a callback'i ge\u00e7irme\n            MyChildButton(onPressed: _handleButtonPressed),\n          ],\n        ),\n      ),\n    );\n  }\n}\n\n\/\/ Alt Widget\nclass MyChildButton extends StatelessWidget {\n  final VoidCallback onPressed; \/\/ VoidCallback tipinde bir parametre\n\n  const MyChildButton({Key? key, required this.onPressed}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return ElevatedButton(\n      onPressed: onPressed, \/\/ Callback fonksiyonunu burada \u00e7a\u011f\u0131r\u0131yoruz\n      child: const Text('T\u0131kla!'),\n    );\n  }\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>MyChildButton<\/code> bir <code>ElevatedButton<\/code> i\u00e7erir ve <code>onPressed<\/code> parametresine d\u0131\u015far\u0131dan gelen <code>VoidCallback<\/code>&#8216;i atar. <code>ParentWidget<\/code> ise <code>_handleButtonPressed<\/code> ad\u0131nda bir fonksiyon tan\u0131mlar ve bu fonksiyonu <code>MyChildButton<\/code>&#8216;a <code>onPressed<\/code> parametresi olarak ge\u00e7irir. Kullan\u0131c\u0131 butona t\u0131klad\u0131\u011f\u0131nda, <code>_handleButtonPressed<\/code> fonksiyonu \u00e7al\u0131\u015f\u0131r, <code>ParentWidget<\/code>&#8216;\u0131n durumunu g\u00fcnceller ve UI yeniden \u00e7izilir.<\/p>\n<h3>VoidCallback Kullan\u0131m Senaryolar\u0131<\/h3>\n<p><code>VoidCallback<\/code>&#8216;in ideal oldu\u011fu baz\u0131 yayg\u0131n senaryolar \u015funlard\u0131r:<\/p>\n<p>1.  <strong>Basit T\u0131klama Olaylar\u0131:<\/strong> Bir <code>Button<\/code>, <code>Card<\/code>, <code>GestureDetector<\/code> veya herhangi bir t\u0131klanabilir widget&#8217;\u0131n t\u0131kland\u0131\u011f\u0131n\u0131 bildirmek. Bu, <code>ElevatedButton<\/code>, <code>TextButton<\/code>, <code>InkWell<\/code> gibi yerle\u015fik widget&#8217;lar\u0131n <code>onPressed<\/code> veya <code>onTap<\/code> parametrelerinin \u00e7o\u011fu zaman bir <code>VoidCallback<\/code> almas\u0131n\u0131n temel nedenidir.<br \/>\n2.  <strong>Durum De\u011fi\u015fikli\u011fi Bildirimleri (Verisiz):<\/strong> Bir <code>Switch<\/code> widget&#8217;\u0131n\u0131n a\u00e7\u0131l\u0131p kapanmas\u0131 gibi basit bir durum de\u011fi\u015fikli\u011fini bildirmek, ancak yeni durumun de\u011ferini (true\/false) do\u011frudan callback ile g\u00f6ndermeye gerek olmad\u0131\u011f\u0131nda (\u00fcst widget bunu kendisi belirleyebiliyorsa). Genellikle <code>Switch<\/code> gibi widget&#8217;lar <code>Function(bool)<\/code> kullan\u0131r, ancak e\u011fer \u00fcst widget&#8217;\u0131n sadece &#8220;de\u011fi\u015fti&#8221; bilgisini almas\u0131 yeterliyse, <code>VoidCallback<\/code> de bir se\u00e7enek olabilir (ancak bu senaryoda <code>Function(bool)<\/code> daha yayg\u0131nd\u0131r).<br \/>\n3.  <strong>\u0130\u015flem Tamamlama Bildirimleri:<\/strong> Bir animasyonun bitti\u011fini, bir dosya y\u00fckleme i\u015fleminin tamamland\u0131\u011f\u0131n\u0131 veya bir a\u011f iste\u011finin ba\u015far\u0131l\u0131 bir \u015fekilde sonu\u00e7land\u0131\u011f\u0131n\u0131 bildirmek. Bu durumlarda, sadece &#8220;i\u015flem bitti&#8221; bilgisi yeterli olabilir.<br \/>\n4.  <strong>Form Alanlar\u0131nda Odaklanma\/Odak Kayb\u0131:<\/strong> Bir <code>TextField<\/code>&#8216;\u0131n odakland\u0131\u011f\u0131n\u0131 veya oda\u011f\u0131 kaybetti\u011fini bildirmek i\u00e7in kullan\u0131labilir (ancak <code>onChanged<\/code> i\u00e7in <code>Function(String)<\/code> daha yayg\u0131nd\u0131r).<\/p>\n<h3>Function(T) Nedir?<\/h3>\n<p><code>Function(T)<\/code> veya daha genel olarak <code>void Function(T arg)<\/code> veya <code>R Function(T arg)<\/code> gibi yap\u0131lar, Dart&#8217;ta belirli arg\u00fcman tipleri alan ve belirli bir d\u00f6n\u00fc\u015f tipi olan fonksiyonlar\u0131 temsil etmek i\u00e7in kullan\u0131l\u0131r. <code>VoidCallback<\/code>&#8216;in aksine, <code>Function(T)<\/code> bir veya daha fazla arg\u00fcman alabilir ve iste\u011fe ba\u011fl\u0131 olarak bir de\u011fer d\u00f6nd\u00fcrebilir.<\/p>\n<p><strong>Tan\u0131m ve Ama\u00e7:<\/strong><br \/>\n<code>Function(T)<\/code>&#8216;in temel amac\u0131, bir alt widget&#8217;tan bir \u00fcst widget&#8217;a sadece bir olay\u0131n meydana geldi\u011fini bildirmekle kalmay\u0131p, ayn\u0131 zamanda bu olayla ilgili belirli verileri de ta\u015f\u0131makt\u0131r. \u00d6rne\u011fin, bir metin giri\u015f alan\u0131na yaz\u0131lan metni, bir se\u00e7iciden se\u00e7ilen de\u011feri veya bir kayd\u0131r\u0131c\u0131dan gelen say\u0131sal de\u011feri \u00fcst widget&#8217;a iletmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p><strong>S\u00f6zdizimi:<\/strong><br \/>\nDart&#8217;ta bir <code>Function(T)<\/code> \u015fu \u015fekilde tan\u0131mlanabilir:<\/p>\n<pre><code class=\"language-dart\">\/\/ Tek arg\u00fcmanl\u0131 ve void d\u00f6n\u00fc\u015fl\u00fc bir fonksiyon\ntypedef ValueChanged<T> = void Function(T value);\n\n\/\/ \u00d6rnek kullan\u0131m:\nvoid Function(String) myStringCallback = (String data) {\n  print('String veri al\u0131nd\u0131: $data');\n};\n\nvoid Function(int) myIntCallback = (int number) {\n  print('Say\u0131 al\u0131nd\u0131: $number');\n};\n\n\/\/ Veya bir widget'\u0131n parametresi olarak:\nclass MyInputWidget extends StatelessWidget {\n  final void Function(String text) onChanged; \/\/ String arg\u00fcman alan void fonksiyon\n\n  const MyInputWidget({Key? key, required this.onChanged}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return TextField(\n      onChanged: onChanged, \/\/ D\u0131\u015far\u0131dan gelen callback'i kullan\n      decoration: const InputDecoration(\n        labelText: 'Metin Girin',\n        border: OutlineInputBorder(),\n      ),\n    );\n  }\n}<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte <code>void Function(String text)<\/code> ifadesi, <code>String<\/code> tipinde tek bir arg\u00fcman alan ve hi\u00e7bir \u015fey d\u00f6nd\u00fcrmeyen bir fonksiyonu belirtir. Dart&#8217;\u0131n tip \u00e7\u0131kar\u0131m\u0131 sayesinde, <code>onChanged: (text) { ... }<\/code> \u015feklinde de yaz\u0131labilir.<\/p>\n<p><strong>Function(T) Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/strong><br \/>\n\u00c7al\u0131\u015fma prensibi <code>VoidCallback<\/code> ile benzerdir, ancak arg\u00fcman ta\u015f\u0131ma yetene\u011fi eklenmi\u015ftir:<br \/>\n1.  <strong>\u00dcst Widget Tan\u0131mlar:<\/strong> \u00dcst widget, belirli bir t\u00fcrde veri alacak bir fonksiyon tan\u0131mlar.<br \/>\n2.  <strong>\u00dcst Widget Ge\u00e7irir:<\/strong> \u00dcst widget, bu fonksiyonu alt widget&#8217;\u0131na bir parametre olarak ge\u00e7irir.<br \/>\n3.  <strong>Alt Widget \u00c7a\u011f\u0131r\u0131r ve Veri Ge\u00e7irir:<\/strong> Alt widget, ilgili olay meydana geldi\u011finde (\u00f6rne\u011fin, metin de\u011fi\u015fti\u011finde) kendisine ge\u00e7irilen bu fonksiyonu, olaya ili\u015fkin veriyle birlikte \u00e7a\u011f\u0131r\u0131r.<br \/>\n4.  <strong>\u00dcst Widget Tepki Verir:<\/strong> Callback \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, \u00fcst widget&#8217;taki tan\u0131ml\u0131 fonksiyon \u00e7al\u0131\u015f\u0131r, ge\u00e7irilen veriyi i\u015fler ve bu sayede \u00fcst widget durumu g\u00fcncelleyebilir veya ba\u015fka bir i\u015flem yapabilir.<\/p>\n<p><strong>Basit \u00d6rnek: Metin Giri\u015fi<\/strong><br \/>\nBir <code>StatelessWidget<\/code> olan <code>MyChildInput<\/code>&#8216;\u0131n, metin de\u011fi\u015fti\u011finde <code>ParentWidget<\/code>&#8216;a girilen metni bildirmesi i\u00e7in <code>Function(String)<\/code> kullan\u0131m\u0131:<\/p>\n<pre><code class=\"language-dart\">\/\/ main.dart dosyas\u0131n\u0131n \u00fcst k\u0131sm\u0131nda zaten var olan MyApp ve main fonksiyonlar\u0131n\u0131 atlayarak devam ediyoruz.\n\n\/\/ \u00dcst Widget (\u00f6nceki ParentWidget'\u0131 de\u011fi\u015ftirelim veya yeni bir tane olu\u015ftural\u0131m)\nclass ParentWidgetWithInput extends StatefulWidget {\n  const ParentWidgetWithInput({Key? key}) : super(key: key);\n\n  @override\n  State<ParentWidgetWithInput> createState() => _ParentWidgetWithInputState();\n}\n\nclass _ParentWidgetWithInputState extends State<ParentWidgetWithInput> {\n  String _inputText = '';\n\n  \/\/ Alt widget'tan gelecek metin verisini i\u015fleyecek fonksiyon\n  void _handleInputChanged(String newText) {\n    setState(() {\n      _inputText = newText;\n    });\n    print('ParentWidgetWithInput: Yeni metin al\u0131nd\u0131: $_inputText');\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text('Function(T) \u00d6rne\u011fi'),\n      ),\n      body: Center(\n        child: Column(\n          mainAxisAlignment: MainAxisAlignment.center,\n          children: <Widget>[\n            Text(\n              'Girilen Metin: $_inputText',\n              style: const TextStyle(fontSize: 20),\n            ),\n            const SizedBox(height: 20),\n            \/\/ Alt widget'a callback'i ge\u00e7irme\n            MyChildInput(onChanged: _handleInputChanged),\n          ],\n        ),\n      ),\n    );\n  }\n}\n\n\/\/ Alt Widget\nclass MyChildInput extends StatelessWidget {\n  final void Function(String text) onChanged; \/\/ String alan void fonksiyon\n\n  const MyChildInput({Key? key, required this.onChanged}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Padding(\n      padding: const EdgeInsets.symmetric(horizontal: 20.0),\n      child: TextField(\n        onChanged: onChanged, \/\/ Callback fonksiyonunu burada \u00e7a\u011f\u0131r\u0131yoruz\n        decoration: const InputDecoration(\n          labelText: 'Bir \u015feyler yaz\u0131n...',\n          border: OutlineInputBorder(),\n        ),\n      ),\n    );\n  }\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>MyChildInput<\/code> bir <code>TextField<\/code> i\u00e7erir ve <code>onChanged<\/code> parametresine d\u0131\u015far\u0131dan gelen <code>void Function(String)<\/code>&#8216;i atar. <code>ParentWidgetWithInput<\/code> ise <code>_handleInputChanged<\/code> ad\u0131nda bir fonksiyon tan\u0131mlar ve bu fonksiyonu <code>MyChildInput<\/code>&#8216;a <code>onChanged<\/code> parametresi olarak ge\u00e7irir. Kullan\u0131c\u0131 <code>TextField<\/code>&#8216;a metin girdi\u011finde, <code>_handleInputChanged<\/code> fonksiyonu girilen metinle birlikte \u00e7al\u0131\u015f\u0131r, <code>ParentWidgetWithInput<\/code>&#8216;\u0131n durumunu g\u00fcnceller ve UI yeniden \u00e7izilir.<\/p>\n<h3>Function(T) Kullan\u0131m Senaryolar\u0131<\/h3>\n<p><code>Function(T)<\/code>&#8216;in ideal oldu\u011fu baz\u0131 yayg\u0131n senaryolar \u015funlard\u0131r:<\/p>\n<p>1.  <strong>Kullan\u0131c\u0131 Giri\u015fi De\u011ferlerini \u0130letme:<\/strong> <code>TextField<\/code>&#8216;dan girilen metin (<code>String<\/code>), <code>Slider<\/code>&#8216;dan se\u00e7ilen de\u011fer (<code>double<\/code>), <code>Checkbox<\/code> veya <code>Radio<\/code>&#8216;dan se\u00e7ilen durum (<code>bool<\/code>) gibi kullan\u0131c\u0131 aray\u00fcz\u00fc elementlerinden gelen de\u011ferleri \u00fcst widget&#8217;a iletmek.<br \/>\n2.  <strong>Liste veya Izgara \u00d6\u011fesi Se\u00e7imi:<\/strong> Bir <code>ListView<\/code> veya <code>GridView<\/code>&#8216;deki bir \u00f6\u011fe t\u0131kland\u0131\u011f\u0131nda, se\u00e7ilen \u00f6\u011fenin kimli\u011fini veya t\u00fcm veri nesnesini \u00fcst widget&#8217;a iletmek. \u00d6rne\u011fin, <code>void Function(Product product)<\/code> bir \u00fcr\u00fcn listesinden se\u00e7ilen \u00fcr\u00fcn\u00fc bildirebilir.<br \/>\n3.  <strong>\u00d6zel Olaylar ve \u0130lgili Veriler:<\/strong> Uygulamaya \u00f6zg\u00fc \u00f6zel bir olay meydana geldi\u011finde, bu olayla ilgili detayl\u0131 verileri (\u00f6rne\u011fin, bir hata kodu, bir i\u015flem sonucu) \u00fcst widget&#8217;a iletmek.<br \/>\n4.  <strong>\u0130\u015flem Sonu\u00e7lar\u0131n\u0131 \u0130letme:<\/strong> Asenkron bir i\u015flemin (API \u00e7a\u011fr\u0131s\u0131, veritaban\u0131 i\u015flemi) tamamland\u0131\u011f\u0131nda, i\u015flemin ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131, hata mesaj\u0131 veya elde edilen veriler gibi sonu\u00e7lar\u0131 \u00fcst widget&#8217;a iletmek.<\/p>\n<h3>VoidCallback ve Function(T) Aras\u0131ndaki Farklar ve Ne Zaman Hangisini Kullanmal\u0131<\/h3>\n<p>Her iki yap\u0131 da alt widget&#8217;lardan \u00fcst widget&#8217;lara ileti\u015fim kurmak i\u00e7in kullan\u0131l\u0131r, ancak temel farklar\u0131 ve kullan\u0131m durumlar\u0131 vard\u0131r:<\/p>\n<p><strong>Farklar:<\/strong><br \/>\n*   <strong>Arg\u00fcmanlar:<\/strong> <code>VoidCallback<\/code> hi\u00e7bir arg\u00fcman almaz. <code>Function(T)<\/code> ise bir veya daha fazla arg\u00fcman alabilir (\u00f6rn. <code>Function(String)<\/code>, <code>Function(int, bool)<\/code>).<br \/>\n*   <strong>Veri Ta\u015f\u0131ma:<\/strong> <code>VoidCallback<\/code> bir olay\u0131n meydana geldi\u011fini bildirir, ancak olayla ilgili veri ta\u015f\u0131maz. <code>Function(T)<\/code> ise olayla birlikte belirli t\u00fcrde verileri (arg\u00fcmanlar arac\u0131l\u0131\u011f\u0131yla) ta\u015f\u0131yabilir.<br \/>\n*   <strong>D\u00f6n\u00fc\u015f De\u011feri:<\/strong> Her ikisi de genellikle <code>void<\/code> (hi\u00e7bir \u015fey) d\u00f6nd\u00fcr\u00fcr, ancak <code>Function<\/code> tipi asl\u0131nda herhangi bir d\u00f6n\u00fc\u015f tipine sahip olabilir (\u00f6rn. <code>int Function(String)<\/code>). Ancak widget&#8217;lar aras\u0131 ileti\u015fimde genellikle <code>void<\/code> d\u00f6n\u00fc\u015fl\u00fc callback&#8217;ler kullan\u0131l\u0131r.<\/p>\n<p><strong>Ne Zaman Hangisini Kullanmal\u0131?<\/strong><\/p>\n<p>*   <strong><code>VoidCallback<\/code> Kullan\u0131m Zamanlar\u0131:<\/strong><br \/>\n    *   Sadece bir olay\u0131n meydana geldi\u011fini bildirmek istedi\u011finizde ve bu olayla ilgili herhangi bir ek bilgiye (veri) ihtiyac\u0131n\u0131z olmad\u0131\u011f\u0131nda.<br \/>\n    *   \u00d6rne\u011fin, bir butonun t\u0131klanmas\u0131, bir animasyonun tamamlanmas\u0131, bir uyar\u0131 kutusunun kapat\u0131lmas\u0131 gibi &#8220;oldu&#8221; veya &#8220;bitti&#8221; tarz\u0131 bildirimler i\u00e7in.<br \/>\n    *   Widget&#8217;\u0131n i\u00e7sel durumunu de\u011fi\u015ftiren ancak bu de\u011fi\u015fikli\u011fin d\u0131\u015far\u0131ya \u00f6zel bir veri g\u00f6ndermesini gerektirmeyen durumlar.<\/p>\n<p>*   <strong><code>Function(T)<\/code> Kullan\u0131m Zamanlar\u0131:<\/strong><br \/>\n    *   Bir olay\u0131n meydana geldi\u011fini bildirmekle birlikte, bu olayla ilgili belirli verileri (metin, say\u0131, nesne vb.) \u00fcst widget&#8217;a iletmeniz gerekti\u011finde.<br \/>\n    *   \u00d6rne\u011fin, bir <code>TextField<\/code>&#8216;dan girilen metni, bir <code>Slider<\/code>&#8216;dan se\u00e7ilen de\u011feri, bir listeden se\u00e7ilen \u00f6\u011feyi veya bir form alan\u0131ndaki de\u011fi\u015fikli\u011fin yeni de\u011ferini \u00fcst widget&#8217;a g\u00f6ndermek i\u00e7in.<br \/>\n    *   \u00dcst widget&#8217;\u0131n, alt widget&#8217;tan gelen veriye dayanarak durumunu g\u00fcncellemesi veya farkl\u0131 bir i\u015flem yapmas\u0131 gerekti\u011finde.<\/p>\n<p>K\u0131sacas\u0131, e\u011fer alt widget&#8217;tan \u00fcst widget&#8217;a sadece bir &#8220;sinyal&#8221; g\u00f6ndermeniz gerekiyorsa <code>VoidCallback<\/code> kullan\u0131n. E\u011fer bu sinyalle birlikte bir &#8220;mesaj&#8221; (veri) da g\u00f6ndermeniz gerekiyorsa <code>Function(T)<\/code> kullan\u0131n.<\/p>\n<h3>Kapsaml\u0131 Kod \u00d6rne\u011fi: Ebeveyn-\u00c7ocuk \u0130leti\u015fimi<\/h3>\n<p>\u015eimdi, hem <code>VoidCallback<\/code> hem de <code>Function(String)<\/code> kullanan daha kapsaml\u0131 bir \u00f6rnek olu\u015ftural\u0131m. Bu \u00f6rnekte, bir <code>ParentWidget<\/code> iki farkl\u0131 alt widget&#8217;tan (biri butondan, di\u011feri metin giri\u015finden) bilgi alacakt\u0131r.<\/p>\n<pre><code class=\"language-dart\">import 'package:flutter\/material.dart';\n\nvoid main() {\n  runApp(const MyApp());\n}\n\nclass MyApp extends StatelessWidget {\n  const MyApp({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      title: 'Widget \u0130leti\u015fim \u00d6rne\u011fi',\n      theme: ThemeData(\n        primarySwatch: Colors.teal,\n      ),\n      home: const ParentWidget(),\n    );\n  }\n}\n\n\/\/ -----------------------------------------------------------------------------\n\/\/ 1. \u00dcst Widget (ParentWidget)\n\/\/ Hem VoidCallback hem de Function(String) ile ileti\u015fim kuracak.\n\/\/ -----------------------------------------------------------------------------\nclass ParentWidget extends StatefulWidget {\n  const ParentWidget({Key? key}) : super(key: key);\n\n  @override\n  State<ParentWidget> createState() => _ParentWidgetState();\n}\n\nclass _ParentWidgetState extends State<ParentWidget> {\n  String _buttonMessage = 'Butona bas\u0131lmad\u0131.';\n  String _inputMessage = 'Hen\u00fcz metin girilmedi.';\n  int _buttonPressCount = 0;\n\n  \/\/ VoidCallback i\u00e7in olay i\u015fleyici\n  void _handleButtonPress() {\n    setState(() {\n      _buttonPressCount++;\n      _buttonMessage = 'Butona $_buttonPressCount kez bas\u0131ld\u0131!';\n    });\n    print('ParentWidget: Buton basma olay\u0131 al\u0131nd\u0131. Toplam: $_buttonPressCount');\n  }\n\n  \/\/ Function(String) i\u00e7in olay i\u015fleyici\n  void _handleInputChanged(String newText) {\n    setState(() {\n      _inputMessage = newText.isEmpty ? 'Hen\u00fcz metin girilmedi.' : 'Girilen metin: \"$newText\"';\n    });\n    print('ParentWidget: Metin giri\u015fi de\u011fi\u015fti: \"$newText\"');\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text('Widget \u0130leti\u015fim \u00d6rne\u011fi'),\n      ),\n      body: Center(\n        child: Padding(\n          padding: const EdgeInsets.all(16.0),\n          child: Column(\n            mainAxisAlignment: MainAxisAlignment.center,\n            children: <Widget>[\n              \/\/ Buton durumunu g\u00f6steren metin\n              Text(\n                _buttonMessage,\n                style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold),\n                textAlign: TextAlign.center,\n              ),\n              const SizedBox(height: 20),\n\n              \/\/ Metin giri\u015f durumunu g\u00f6steren metin\n              Text(\n                _inputMessage,\n                style: const TextStyle(fontSize: 18),\n                textAlign: TextAlign.center,\n              ),\n              const SizedBox(height: 40),\n\n              \/\/ Alt widget'a VoidCallback ge\u00e7irme\n              ChildButtonWidget(\n                onButtonPressed: _handleButtonPress,\n              ),\n              const SizedBox(height: 20),\n\n              \/\/ Alt widget'a Function(String) ge\u00e7irme\n              ChildInputWidget(\n                onTextChanged: _handleInputChanged,\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n\n\/\/ -----------------------------------------------------------------------------\n\/\/ 2. Alt Widget (ChildButtonWidget) - VoidCallback Kullan\u0131m\u0131\n\/\/ -----------------------------------------------------------------------------\nclass ChildButtonWidget extends StatelessWidget {\n  final VoidCallback onButtonPressed; \/\/ VoidCallback tipinde bir parametre\n\n  const ChildButtonWidget({Key? key, required this.onButtonPressed}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return ElevatedButton(\n      onPressed: onButtonPressed, \/\/ \u00dcst widget'tan gelen callback'i \u00e7a\u011f\u0131r\n      style: ElevatedButton.styleFrom(\n        padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 15),\n      ),\n      child: const Text(\n        'Bana T\u0131kla (VoidCallback)',\n        style: TextStyle(fontSize: 16),\n      ),\n    );\n  }\n}\n\n\/\/ -----------------------------------------------------------------------------\n\/\/ 3. Alt Widget (ChildInputWidget) - Function(String) Kullan\u0131m\u0131\n\/\/ -----------------------------------------------------------------------------\nclass ChildInputWidget extends StatefulWidget {\n  final void Function(String text) onTextChanged; \/\/ String alan void fonksiyon\n\n  const ChildInputWidget({Key? key, required this.onTextChanged}) : super(key: key);\n\n  @override\n  State<ChildInputWidget> createState() => _ChildInputWidgetState();\n}\n\nclass _ChildInputWidgetState extends State<ChildInputWidget> {\n  final TextEditingController _controller = TextEditingController();\n\n  @override\n  void dispose() {\n    _controller.dispose();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return TextField(\n      controller: _controller,\n      onChanged: (text) {\n        \/\/ \u00dcst widget'tan gelen callback'i, girilen metinle \u00e7a\u011f\u0131r\n        widget.onTextChanged(text);\n      },\n      decoration: const InputDecoration(\n        labelText: 'Buraya bir \u015feyler yaz\u0131n (Function(String))',\n        border: OutlineInputBorder(),\n        contentPadding: EdgeInsets.symmetric(horizontal: 15, vertical: 10),\n      ),\n      style: const TextStyle(fontSize: 16),\n    );\n  }\n}<\/code><\/pre>\n<p><strong>Kodun A\u00e7\u0131klamas\u0131:<\/strong><\/p>\n<p>*   <strong><code>MyApp<\/code>:<\/strong> Uygulaman\u0131n k\u00f6k widget&#8217;\u0131. <code>MaterialApp<\/code>&#8216;i ve <code>ParentWidget<\/code>&#8216;\u0131 ba\u015flat\u0131r.<br \/>\n*   <strong><code>ParentWidget<\/code>:<\/strong><br \/>\n    *   Bir <code>StatefulWidget<\/code>&#8216;t\u0131r \u00e7\u00fcnk\u00fc alt widget&#8217;lardan gelen bilgilere g\u00f6re kendi durumunu (<code>_buttonMessage<\/code>, <code>_inputMessage<\/code>, <code>_buttonPressCount<\/code>) g\u00fcncellemesi gerekir.<br \/>\n    *   <code>_handleButtonPress<\/code> ad\u0131nda bir <code>VoidCallback<\/code> i\u015fleyicisi tan\u0131mlar. Bu fonksiyon, <code>ChildButtonWidget<\/code>&#8216;tan gelen t\u0131klama olaylar\u0131n\u0131 dinler ve <code>_buttonMessage<\/code> ile <code>_buttonPressCount<\/code>&#8216;u g\u00fcnceller.<br \/>\n    *   <code>_handleInputChanged<\/code> ad\u0131nda bir <code>void Function(String)<\/code> i\u015fleyicisi tan\u0131mlar. Bu fonksiyon, <code>ChildInputWidget<\/code>&#8216;tan gelen metin de\u011fi\u015fikliklerini dinler ve <code>_inputMessage<\/code>&#8216;\u0131 g\u00fcnceller.<br \/>\n    *   <code>build<\/code> metodunda, bu iki i\u015fleyici fonksiyonu ilgili alt widget&#8217;lara parametre olarak ge\u00e7irir.<br \/>\n    *   Ekranda, alt widget&#8217;lardan gelen bilgilere g\u00f6re g\u00fcncellenen mesajlar\u0131 g\u00f6sterir.<br \/>\n*   <strong><code>ChildButtonWidget<\/code>:<\/strong><br \/>\n    *   Bir <code>StatelessWidget<\/code>&#8216;t\u0131r \u00e7\u00fcnk\u00fc kendi i\u00e7inde bir durum y\u00f6netimi yapmaz, sadece bir <code>ElevatedButton<\/code>&#8216;\u0131 sarar.<br \/>\n    *   <code>onButtonPressed<\/code> ad\u0131nda <code>final VoidCallback<\/code> tipinde bir parametre al\u0131r. <code>required<\/code> anahtar kelimesi, bu parametrenin zorunlu oldu\u011funu belirtir.<br \/>\n    *   <code>ElevatedButton<\/code>&#8216;\u0131n <code>onPressed<\/code> \u00f6zelli\u011fine, kendisine d\u0131\u015far\u0131dan gelen <code>onButtonPressed<\/code> callback&#8217;ini atar. B\u00f6ylece butona t\u0131kland\u0131\u011f\u0131nda, <code>ParentWidget<\/code>&#8216;taki <code>_handleButtonPress<\/code> fonksiyonu \u00e7al\u0131\u015f\u0131r.<br \/>\n*   <strong><code>ChildInputWidget<\/code>:<\/strong><br \/>\n    *   Bir <code>StatefulWidget<\/code>&#8216;t\u0131r \u00e7\u00fcnk\u00fc bir <code>TextEditingController<\/code> y\u00f6netir (her ne kadar <code>onChanged<\/code> ile do\u011frudan ileti\u015fim kurabilse de, controller kullan\u0131m\u0131 daha robust bir yakla\u015f\u0131md\u0131r).<br \/>\n    *   <code>onTextChanged<\/code> ad\u0131nda <code>final void Function(String text)<\/code> tipinde bir parametre al\u0131r. Bu, metin de\u011fi\u015fti\u011finde \u00fcst widget&#8217;a yeni metni g\u00f6nderecek olan callback&#8217;tir.<br \/>\n    *   <code>TextField<\/code>&#8216;\u0131n <code>onChanged<\/code> \u00f6zelli\u011fine, bir lambda fonksiyonu atar. Bu lambda fonksiyonu, <code>TextField<\/code>&#8216;dan gelen <code>text<\/code> arg\u00fcman\u0131n\u0131 alarak <code>widget.onTextChanged(text)<\/code> \u00e7a\u011fr\u0131s\u0131n\u0131 yapar. B\u00f6ylece girilen metin <code>ParentWidget<\/code>&#8216;taki <code>_handleInputChanged<\/code> fonksiyonuna iletilir.<\/p>\n<p>Bu \u00f6rnek, <code>VoidCallback<\/code> ve <code>Function(T)<\/code>&#8216;nin widget&#8217;lar aras\u0131 temel ileti\u015fimi nas\u0131l sa\u011flad\u0131\u011f\u0131n\u0131 a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Alt widget&#8217;lar, kendilerine verilen callback&#8217;leri \u00e7a\u011f\u0131rarak \u00fcst widget&#8217;lar\u0131n\u0131 belirli olaylar hakk\u0131nda bilgilendirir ve\/veya veri g\u00f6nderir.<\/p>\n<h3>S\u0131n\u0131rlamalar ve Alternatifler<\/h3>\n<p><code>VoidCallback<\/code> ve <code>Function(T)<\/code> gibi callback tabanl\u0131 ileti\u015fim mekanizmalar\u0131, Flutter&#8217;da widget&#8217;lar aras\u0131 ileti\u015fimin temelini olu\u015fturur ve basit ebeveyn-\u00e7ocuk ileti\u015fim senaryolar\u0131 i\u00e7in olduk\u00e7a etkilidir. Ancak, uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e ve widget a\u011fac\u0131n\u0131z derinle\u015ftik\u00e7e, bu y\u00f6ntemlerin baz\u0131 s\u0131n\u0131rlamalar\u0131 ortaya \u00e7\u0131kabilir:<\/p>\n<p>1.  <strong>Prop Drilling (Prop Zinciri):<\/strong> E\u011fer bir olay\u0131n veya verinin \u00e7ok derinlerdeki bir alt widget&#8217;tan \u00e7ok yukar\u0131daki bir \u00fcst widget&#8217;a iletilmesi gerekiyorsa, bu callback&#8217;leri aradaki her widget&#8217;tan tek tek ge\u00e7irmek zorunda kalabilirsiniz. Bu duruma &#8220;prop drilling&#8221; veya &#8220;callback hell&#8221; denir. Kodun okunabilirli\u011fini ve bak\u0131m\u0131n\u0131 zorla\u015ft\u0131r\u0131r, ayr\u0131ca gereksiz yere bir\u00e7ok widget&#8217;\u0131n parametrelerini art\u0131r\u0131r.<br \/>\n2.  <strong>Karde\u015f Widget \u0130leti\u015fimi:<\/strong> Bu callback mekanizmalar\u0131 do\u011frudan ebeveyn-\u00e7ocuk ili\u015fkisi i\u00e7in tasarlanm\u0131\u015ft\u0131r. Karde\u015f (sibling) widget&#8217;lar aras\u0131nda ileti\u015fim kurmak i\u00e7in, her iki karde\u015f widget&#8217;\u0131n da ortak bir \u00fcst widget&#8217;\u0131na callback g\u00f6ndermesi ve \u00fcst widget&#8217;\u0131n durumu g\u00fcncelleyerek di\u011fer karde\u015fi yeniden \u00e7izmesi gerekir. Bu da karma\u015f\u0131kl\u0131\u011f\u0131 art\u0131rabilir.<\/p>\n<p>Bu s\u0131n\u0131rlamalar\u0131 a\u015fmak ve daha b\u00fcy\u00fck, daha karma\u015f\u0131k uygulamalarda durum y\u00f6netimini daha verimli hale getirmek i\u00e7in Flutter toplulu\u011fu \u00e7e\u015fitli geli\u015fmi\u015f durum y\u00f6netimi (state management) \u00e7\u00f6z\u00fcmleri geli\u015ftirmi\u015ftir. Bu \u00e7\u00f6z\u00fcmler, widget a\u011fac\u0131n\u0131n herhangi bir yerinden duruma eri\u015fimi ve durumu g\u00fcncellemeyi kolayla\u015ft\u0131r\u0131r:<\/p>\n<p>*   <strong><code>Provider<\/code>:<\/strong> Flutter&#8217;\u0131n \u00f6nerdi\u011fi ve en yayg\u0131n kullan\u0131lan durum y\u00f6netim \u00e7\u00f6z\u00fcmlerinden biridir. <code>InheritedWidget<\/code> \u00fczerine kuruludur ve widget a\u011fac\u0131nda a\u015fa\u011f\u0131 do\u011fru veri ge\u00e7irmeyi ve de\u011fi\u015fiklikleri dinlemeyi kolayla\u015ft\u0131r\u0131r.<br \/>\n*   <strong><code>Bloc\/Cubit<\/code>:<\/strong> \u0130\u015f mant\u0131\u011f\u0131n\u0131 UI&#8217;dan ay\u0131rmak i\u00e7in tasarlanm\u0131\u015f, test edilebilir ve \u00f6l\u00e7eklenebilir bir mimari yakla\u015f\u0131md\u0131r. B\u00fcy\u00fck uygulamalar i\u00e7in idealdir.<br \/>\n*   <strong><code>Riverpod<\/code>:<\/strong> <code>Provider<\/code>&#8216;\u0131n geli\u015ftirilmi\u015f bir versiyonu olarak tan\u0131t\u0131lan, derleme zaman\u0131 g\u00fcvenli\u011fi ve test edilebilirli\u011fi art\u0131ran bir k\u00fct\u00fcphanedir.<br \/>\n*   <strong><code>GetX<\/code>:<\/strong> H\u0131zl\u0131 ve kolay durum y\u00f6netimi, rota y\u00f6netimi ve ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu sa\u011flayan pop\u00fcler bir mikro \u00e7er\u00e7evedir.<br \/>\n*   <strong><code>InheritedWidget<\/code>:<\/strong> Flutter&#8217;\u0131n kendi i\u00e7inde bulunan, bir widget a\u011fac\u0131nda verileri a\u015fa\u011f\u0131 do\u011fru verimli bir \u015fekilde yaymak i\u00e7in kullan\u0131lan temel bir yap\u0131d\u0131r. Di\u011fer bir\u00e7ok durum y\u00f6netim \u00e7\u00f6z\u00fcm\u00fc <code>InheritedWidget<\/code> \u00fczerine in\u015fa edilmi\u015ftir.<\/p>\n<p>Bu geli\u015fmi\u015f \u00e7\u00f6z\u00fcmler, \u00f6zellikle payla\u015f\u0131lan durumun (shared state) veya global durumun (global state) y\u00f6netilmesi gerekti\u011finde devreye girer. Ancak, tek bir alt widget&#8217;tan hemen \u00fcst widget&#8217;a basit bir olay veya veri aktar\u0131m\u0131 gerekti\u011finde, <code>VoidCallback<\/code> ve <code>Function(T)<\/code> hala en basit, en hafif ve en anla\u015f\u0131l\u0131r \u00e7\u00f6z\u00fcmlerdir. Hangi y\u00f6ntemin kullan\u0131laca\u011f\u0131, uygulaman\u0131n b\u00fcy\u00fckl\u00fc\u011f\u00fcne, karma\u015f\u0131kl\u0131\u011f\u0131na ve ileti\u015fim ihtiyac\u0131n\u0131n kapsam\u0131na ba\u011fl\u0131d\u0131r.<\/p>\n<h3>\u0130yi Uygulamalar ve \u0130pu\u00e7lar\u0131<\/h3>\n<p><code>VoidCallback<\/code> ve <code>Function(T)<\/code> kullan\u0131rken kodunuzu daha okunabilir, bak\u0131m\u0131 kolay ve hatas\u0131z hale getirmek i\u00e7in baz\u0131 iyi uygulamalar\u0131 takip etmek \u00f6nemlidir:<\/p>\n<p>1.  <strong>Callback&#8217;leri M\u00fcmk\u00fcn Oldu\u011funca \u00d6zel Tutun:<\/strong> Callback&#8217;in ad\u0131n\u0131 ve imzas\u0131n\u0131, ger\u00e7ekle\u015ftirdi\u011fi i\u015flevi a\u00e7\u0131k\u00e7a yans\u0131tacak \u015fekilde belirleyin. \u00d6rne\u011fin, <code>onPressed<\/code> yerine <code>onItemDeleted<\/code> veya <code>onUserSelected<\/code> gibi daha a\u00e7\u0131klay\u0131c\u0131 isimler kullan\u0131n.<br \/>\n2.  <strong>Gereksiz Yere Karma\u015f\u0131k Callback \u0130mzalar\u0131ndan Ka\u00e7\u0131n\u0131n:<\/strong> Callback&#8217;ler, yaln\u0131zca \u00fcst widget&#8217;\u0131n ihtiya\u00e7 duydu\u011fu verileri almal\u0131d\u0131r. \u00c7ok fazla arg\u00fcman alan veya gereksiz yere karma\u015f\u0131k tipler kullanan callback&#8217;lerden ka\u00e7\u0131n\u0131n. E\u011fer \u00e7ok fazla veri iletmeniz gerekiyorsa, bu verileri kapsayan \u00f6zel bir s\u0131n\u0131f veya <code>typedef<\/code> tan\u0131mlamay\u0131 d\u00fc\u015f\u00fcnebilirsiniz.<br \/>\n3.  <strong>Callback Parametrelerini <code>final<\/code> Olarak Tan\u0131mlay\u0131n:<\/strong> Widget&#8217;lar\u0131n constructor&#8217;lar\u0131nda callback&#8217;leri <code>final<\/code> olarak tan\u0131mlamak, bu callback&#8217;lerin widget&#8217;\u0131n \u00f6mr\u00fc boyunca de\u011fi\u015fmeyece\u011fini garanti eder ve kodun daha \u00f6ng\u00f6r\u00fclebilir olmas\u0131n\u0131 sa\u011flar.<br \/>\n4.  <strong><code>null<\/code> Kontrol\u00fc Yap\u0131n:<\/strong> Bir callback parametresi iste\u011fe ba\u011fl\u0131 (nullable) ise (yani <code>final VoidCallback? onPressed;<\/code>), alt widget&#8217;ta bu callback&#8217;i \u00e7a\u011f\u0131rmadan \u00f6nce <code>null<\/code> kontrol\u00fc yap\u0131n. Bu, <code>onPressed?.call();<\/code> veya <code>if (onPressed != null) { onPressed(); }<\/code> \u015feklinde yap\u0131labilir. Bu, \u00fcst widget&#8217;\u0131n callback&#8217;i sa\u011flamay\u0131 tercih etmedi\u011fi durumlarda uygulaman\u0131n \u00e7\u00f6kmesini engeller.<br \/>\n5.  <strong>Widget Sorumluluklar\u0131n\u0131 Ay\u0131r\u0131n:<\/strong> Her widget&#8217;\u0131n tek bir sorumlulu\u011fu olmal\u0131d\u0131r. Alt widget&#8217;lar sadece kendi UI&#8217;lar\u0131n\u0131 \u00e7izmeli ve olaylar\u0131 \u00fcst widget&#8217;a bildirmelidir. \u0130\u015f mant\u0131\u011f\u0131 ve durum y\u00f6netimi genellikle \u00fcst widget&#8217;ta veya ayr\u0131 bir durum y\u00f6netim katman\u0131nda yap\u0131lmal\u0131d\u0131r. Bu, kodun daha mod\u00fcler ve test edilebilir olmas\u0131n\u0131 sa\u011flar.<br \/>\n6.  <strong><code>setState<\/code>&#8216;i Do\u011fru Yerde Kullan\u0131n:<\/strong> Alt widget&#8217;tan gelen bir callback, \u00fcst widget&#8217;\u0131n durumunu de\u011fi\u015ftirdi\u011finde, bu de\u011fi\u015fikli\u011fin UI&#8217;a yans\u0131mas\u0131 i\u00e7in <code>setState<\/code> \u00e7a\u011fr\u0131s\u0131n\u0131n \u00fcst widget&#8217;\u0131n <code>State<\/code> s\u0131n\u0131f\u0131 i\u00e7inde yap\u0131lmas\u0131 gerekti\u011fini unutmay\u0131n.<br \/>\n7.  <strong><code>typedef<\/code> Kullan\u0131m\u0131n\u0131 De\u011ferlendirin:<\/strong> Karma\u015f\u0131k <code>Function<\/code> tiplerini daha okunabilir hale getirmek i\u00e7in <code>typedef<\/code> kullanabilirsiniz. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-dart\">typedef ItemSelectedCallback = void Function(String itemId);\n\n    class MyList extends StatelessWidget {\n      final ItemSelectedCallback onItemSelected;\n      \/\/ ...\n    }<\/code><\/pre>\n<p>    Bu, kodun daha temiz ve anla\u015f\u0131l\u0131r olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Flutter&#8217;da widget&#8217;lar aras\u0131 ileti\u015fim, dinamik ve etkile\u015fimli kullan\u0131c\u0131 aray\u00fczleri olu\u015fturman\u0131n temel bir par\u00e7as\u0131d\u0131r. <code>VoidCallback<\/code> ve <code>Function(T)<\/code> gibi callback tabanl\u0131 mekanizmalar, bu ileti\u015fimin en basit ve en yayg\u0131n kullan\u0131lan y\u00f6ntemleridir.<\/p>\n<p>*   <strong><code>VoidCallback<\/code><\/strong>, alt widget&#8217;tan \u00fcst widget&#8217;a sadece bir olay\u0131n meydana geldi\u011fini bildirmek i\u00e7in kullan\u0131l\u0131rken,<br \/>\n*   <strong><code>Function(T)<\/code><\/strong> ise olayla birlikte belirli verileri de \u00fcst widget&#8217;a iletmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p>Bu makalede sundu\u011fumuz kapsaml\u0131 \u00f6rnekler ve a\u00e7\u0131klamalarla, bu iki temel ileti\u015fim y\u00f6ntemini ne zaman ve nas\u0131l kullanman\u0131z gerekti\u011fini anlam\u0131\u015f olmal\u0131s\u0131n\u0131z. Basit ebeveyn-\u00e7ocuk ileti\u015fimleri i\u00e7in bu y\u00f6ntemler son derece g\u00fc\u00e7l\u00fc ve yeterlidir. Uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e ve karma\u015f\u0131kla\u015ft\u0131k\u00e7a, <code>Provider<\/code>, <code>Bloc<\/code>, <code>Riverpod<\/code> gibi daha geli\u015fmi\u015f durum y\u00f6netimi \u00e7\u00f6z\u00fcmlerini de\u011ferlendirmeniz gerekebilir. Ancak, bu geli\u015fmi\u015f \u00e7\u00f6z\u00fcmlerin bile temelinde callback&#8217;ler ve Flutter&#8217;\u0131n widget a\u011fac\u0131ndaki veri ak\u0131\u015f\u0131 prensipleri yatar. Bu temel mekanizmalar\u0131 sa\u011flam bir \u015fekilde kavramak, Flutter geli\u015ftirme yolculu\u011funuzda size b\u00fcy\u00fck bir avantaj sa\u011flayacakt\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Flutter&#8217;da Widget&#8217;lar Aras\u0131 \u0130leti\u015fim: VoidCallback ve Function(T) Kullan\u0131m\u0131\nGiri\u015f\nFlutter, Google taraf\u0131ndan geli\u015ftirilen, tek kod taban\u0131yla","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-34165","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>Flutter&#039;da Widget&#039;lar Aras\u0131 \u0130leti\u015fim: VoidCallback ve Function(T) Kullan\u0131m\u0131 - 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\/flutterda-widgetlar-arasi-iletisim-voidcallback-ve-functiont-kullanimi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Flutter&#039;da Widget&#039;lar Aras\u0131 \u0130leti\u015fim: VoidCallback ve Function(T) Kullan\u0131m\u0131\" \/>\n<meta property=\"og:description\" content=\"Flutter&#039;da Widget&#039;lar Aras\u0131 \u0130leti\u015fim: VoidCallback ve Function(T) Kullan\u0131m\u0131 Giri\u015f Flutter, Google taraf\u0131ndan geli\u015ftirilen, tek kod taban\u0131yla\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/flutterda-widgetlar-arasi-iletisim-voidcallback-ve-functiont-kullanimi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-12T01:40:55+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=\"21 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flutterda-widgetlar-arasi-iletisim-voidcallback-ve-functiont-kullanimi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flutterda-widgetlar-arasi-iletisim-voidcallback-ve-functiont-kullanimi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Flutter&#8217;da Widget&#8217;lar Aras\u0131 \u0130leti\u015fim: VoidCallback ve Function(T) Kullan\u0131m\u0131\",\"datePublished\":\"2025-11-12T01:40:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flutterda-widgetlar-arasi-iletisim-voidcallback-ve-functiont-kullanimi\/\"},\"wordCount\":2999,\"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\/flutterda-widgetlar-arasi-iletisim-voidcallback-ve-functiont-kullanimi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flutterda-widgetlar-arasi-iletisim-voidcallback-ve-functiont-kullanimi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/flutterda-widgetlar-arasi-iletisim-voidcallback-ve-functiont-kullanimi\/\",\"name\":\"Flutter'da Widget'lar Aras\u0131 \u0130leti\u015fim: VoidCallback ve Function(T) Kullan\u0131m\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-12T01:40:55+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flutterda-widgetlar-arasi-iletisim-voidcallback-ve-functiont-kullanimi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/flutterda-widgetlar-arasi-iletisim-voidcallback-ve-functiont-kullanimi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flutterda-widgetlar-arasi-iletisim-voidcallback-ve-functiont-kullanimi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Flutter&#8217;da Widget&#8217;lar Aras\u0131 \u0130leti\u015fim: VoidCallback ve Function(T) Kullan\u0131m\u0131\"}]},{\"@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":"Flutter'da Widget'lar Aras\u0131 \u0130leti\u015fim: VoidCallback ve Function(T) Kullan\u0131m\u0131 - 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\/flutterda-widgetlar-arasi-iletisim-voidcallback-ve-functiont-kullanimi\/","og_locale":"tr_TR","og_type":"article","og_title":"Flutter'da Widget'lar Aras\u0131 \u0130leti\u015fim: VoidCallback ve Function(T) Kullan\u0131m\u0131","og_description":"Flutter'da Widget'lar Aras\u0131 \u0130leti\u015fim: VoidCallback ve Function(T) Kullan\u0131m\u0131 Giri\u015f Flutter, Google taraf\u0131ndan geli\u015ftirilen, tek kod taban\u0131yla","og_url":"https:\/\/fatihsoysal.com\/blog\/flutterda-widgetlar-arasi-iletisim-voidcallback-ve-functiont-kullanimi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-12T01:40:55+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"21 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/flutterda-widgetlar-arasi-iletisim-voidcallback-ve-functiont-kullanimi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/flutterda-widgetlar-arasi-iletisim-voidcallback-ve-functiont-kullanimi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Flutter&#8217;da Widget&#8217;lar Aras\u0131 \u0130leti\u015fim: VoidCallback ve Function(T) Kullan\u0131m\u0131","datePublished":"2025-11-12T01:40:55+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/flutterda-widgetlar-arasi-iletisim-voidcallback-ve-functiont-kullanimi\/"},"wordCount":2999,"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\/flutterda-widgetlar-arasi-iletisim-voidcallback-ve-functiont-kullanimi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/flutterda-widgetlar-arasi-iletisim-voidcallback-ve-functiont-kullanimi\/","url":"https:\/\/fatihsoysal.com\/blog\/flutterda-widgetlar-arasi-iletisim-voidcallback-ve-functiont-kullanimi\/","name":"Flutter'da Widget'lar Aras\u0131 \u0130leti\u015fim: VoidCallback ve Function(T) Kullan\u0131m\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-12T01:40:55+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/flutterda-widgetlar-arasi-iletisim-voidcallback-ve-functiont-kullanimi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/flutterda-widgetlar-arasi-iletisim-voidcallback-ve-functiont-kullanimi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/flutterda-widgetlar-arasi-iletisim-voidcallback-ve-functiont-kullanimi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Flutter&#8217;da Widget&#8217;lar Aras\u0131 \u0130leti\u015fim: VoidCallback ve Function(T) Kullan\u0131m\u0131"}]},{"@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\/34165","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=34165"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34165\/revisions"}],"predecessor-version":[{"id":34166,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34165\/revisions\/34166"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34165"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34165"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34165"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}