sametcilingir

Added README.tr-TR.md

  1 +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png)
  2 +
  3 +[![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get)
  4 +[![popularity](https://badges.bar/get/popularity)](https://pub.dev/packages/sentry/score)
  5 +[![likes](https://badges.bar/get/likes)](https://pub.dev/packages/get/score)
  6 +[![pub points](https://badges.bar/get/pub%20points)](https://pub.dev/packages/get/score)
  7 +![building](https://github.com/jonataslaw/get/workflows/build/badge.svg)
  8 +[![style: effective dart](https://img.shields.io/badge/style-effective_dart-40c4ff.svg)](https://pub.dev/packages/effective_dart)
  9 +[![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N)
  10 +[![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx)
  11 +[![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g)
  12 +<a href="https://github.com/Solido/awesome-flutter">
  13 +<img alt="Awesome Flutter" src="https://img.shields.io/badge/Awesome-Flutter-blue.svg?longCache=true&style=flat-square" />
  14 +</a>
  15 +<a href="https://www.buymeacoffee.com/jonataslaw" target="_blank"><img src="https://i.imgur.com/aV6DDA7.png" alt="Buy Me A Coffee" style="height: 41px !important;width: 174px !important; box-shadow: 0px 3px 2px 0px rgba(190, 190, 190, 0.5) !important;-webkit-box-shadow: 0px 3px 2px 0px rgba(190, 190, 190, 0.5) !important;" > </a>
  16 +
  17 +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/getx.png)
  18 +
  19 +
  20 +<div align="center">
  21 +
  22 +**Languages:**
  23 +
  24 +
  25 +[![English](https://img.shields.io/badge/Language-English-blueviolet?style=for-the-badge)](README.md)
  26 +[![Vietnamese](https://img.shields.io/badge/Language-Vietnamese-blueviolet?style=for-the-badge)](README-vi.md)
  27 +[![Indonesian](https://img.shields.io/badge/Language-Indonesian-blueviolet?style=for-the-badge)](README.id-ID.md)
  28 +[![Urdu](https://img.shields.io/badge/Language-Urdu-blueviolet?style=for-the-badge)](README.ur-PK.md)
  29 +[![Chinese](https://img.shields.io/badge/Language-Chinese-blueviolet?style=for-the-badge)](README.zh-cn.md)
  30 +[![Portuguese](https://img.shields.io/badge/Language-Portuguese-blueviolet?style=for-the-badge)](README.pt-br.md)
  31 +[![Spanish](https://img.shields.io/badge/Language-Spanish-blueviolet?style=for-the-badge)](README-es.md)
  32 +[![Russian](https://img.shields.io/badge/Language-Russian-blueviolet?style=for-the-badge)](README.ru.md)
  33 +[![Polish](https://img.shields.io/badge/Language-Polish-blueviolet?style=for-the-badge)](README.pl.md)
  34 +[![Korean](https://img.shields.io/badge/Language-Korean-blueviolet?style=for-the-badge)](README.ko-kr.md)
  35 +[![French](https://img.shields.io/badge/Language-French-blueviolet?style=for-the-badge)](README-fr.md)
  36 +[![Japanese](https://img.shields.io/badge/Language-Japanese-blueviolet?style=for-the-badge)](README.ja-JP.md)
  37 +[![Japanese](https://img.shields.io/badge/Language-Turkish-blueviolet?style=for-the-badge)](README.tr-TR.md)
  38 +
  39 +
  40 +</div>
  41 +
  42 +- [Get Hakkında](#about-get)
  43 +- [Kurulum](#installing)
  44 +- [GetX ile Sayaç Uygulaması](#counter-app-with-getx)
  45 +- [Üç Temel Kavram](#the-three-pillars)
  46 + - [State Management (Durum Yönetimi)](#state-management)
  47 + - [Reactive State Manager (Reaktif Durum Yönetimi)](#reactive-state-manager)
  48 + - [State Management Hakkında Daha Fazla Bilgi](#more-details-about-state-management)
  49 + - [Route Management (Rota Yönetimi)](#route-management)
  50 + - [Route Management Hakkında Daha Fazla Bilgi](#more-details-about-route-management)
  51 + - [Dependency Management (Bağımlılık Yönetimi)](#dependency-management)
  52 + - [Dependency Management Hakkında Daha Fazla Bilgi](#more-details-about-dependency-management)
  53 +- [Utils](#utils)
  54 + - [Internationalization (Uluslararasılaşma)](#internationalization)
  55 + - [Translations (Çeviriler)](#translations)
  56 + - [Translations Kullanımı](#using-translations)
  57 + - [Locales (Yerel Ayarlar)](#locales)
  58 + - [Locale Değiştirme](#change-locale)
  59 + - [System locale (Yerel Sistem Ayarları)](#system-locale)
  60 + - [Tema Değiştirme](#change-theme)
  61 + - [GetConnect](#getconnect)
  62 + - [Varsayılan Ayarlar](#default-configuration)
  63 + - [Özel Ayarlarlamalar](#custom-configuration)
  64 + - [GetPage Middleware](#getpage-middleware)
  65 + - [Priority (Öncelik)](#priority)
  66 + - [Redirect (Yönlendirme)](#redirect)
  67 + - [onPageCalled](#onpagecalled)
  68 + - [OnBindingsStart](#onbindingsstart)
  69 + - [OnPageBuildStart](#onpagebuildstart)
  70 + - [OnPageBuilt](#onpagebuilt)
  71 + - [OnPageDispose](#onpagedispose)
  72 + - [Advanced APIs (Gelişmiş API'ler)](#other-advanced-apis)
  73 + - [Opsiyonel Genel Ayarlar ve Manuel Ayarlamalar](#optional-global-settings-and-manual-configurations)
  74 + - [Local State Widgets (Yerel Durum Widgetları)](#local-state-widgets)
  75 + - [ValueBuilder](#valuebuilder)
  76 + - [ObxValue](#obxvalue)
  77 + - [Faydalı İpuçları](#useful-tips)
  78 + - [GetView](#getview)
  79 + - [GetResponsiveView](#getresponsiveview)
  80 + - [Nasıl Kullanılır?](#how-to-use-it)
  81 + - [GetWidget](#getwidget)
  82 + - [GetxService](#getxservice)
  83 +- [2.0 İle Gelen Büyük Değişiklikler](#breaking-changes-from-20)
  84 +- [Neden Getx?](#why-getx)
  85 +- [Topluluk](#community)
  86 + - [Topluluk Kanalları](#community-channels)
  87 + - [Nasıl katkıda bulunulur?](#how-to-contribute)
  88 + - [Makaleler ve videolar](#articles-and-videos)
  89 +
  90 +# About Get
  91 +
  92 +- GetX, Flutter için oldukça basit ve güçlü bir çözüm yoludur. Yüksek performanslı state managment (durum yönetimi), yetenekli dependency injection (bağımlılık enjeksiyonu) ve route management'ı (rota yönetimi) hızlı ve pratik şekilde bir araya getirir.
  93 +
  94 +- GetX'in 3 temel ilkesi vardır. Bu ilkeler kütüphanedeki tüm kaynaklar için önemlidir: **ÜRETKENLİK, PERFORMANS VE ORGANİZASYON.**
  95 +
  96 + - **PERFORMANS:** GetX, performansa ve kaynakların minimum düzeyde tüketimine odaklanmıştır. GetX, Streams ya da ChangeNotifier kullanmaz.
  97 +
  98 + - **ÜRETKENLİK:** GetX kolay ve keyifli bir syntax (yazım kuralları) kullanır. Ne yapmak istersen iste GetX'de her zaman kolay bir çözüm yolu vardır. Saatlerce süren geliştirmeden tasarruf etmeyi ve uygulanın size sağladığı performansı maksimum seviyede kullanmayı mümkün kılar.
  99 +
  100 + Normalde geliştirici, controller'ları hafızadan kaldırmakla ilgilenmelidir. GetX ile bunu yapmaya gerek kalmaz çünkü varsayılan olarak kaynaklar kullanılmadığı zaman hafızadan kendiliğinden kaldırılır. Eğer hafızada tutmak istiyorsanız, dependency içinde "permanent: true" olarak tanımlanmanız gerekmektedir. Bu şekilde hem zaman tasarrufu hem de hafızadaki gereksiz dependency'lerin oluşturabileceği riskler azaltmış olur. Dependency yüklemesi varsayılan olarak lazy'dir (tembeldir).
  101 +
  102 + - **ORGANİZASYON:** GetX, presentation logic'i (sunum mantığını, business logic'i (iş mantığını), dependency injection'ı, navigasyonu View'dan tamamen ayırmayı sağlar. Route'lar arasında navigasyon için context'e gerek duyulmaz bu sayede widget tree'ye (widget ağacına) bağımlı kalmazsınız. Controllers ya da blocs'daki inheritedWidget'a erişmek için context'e ihtiyaç duyulmaz böylelikle presentation logic ve business logic, view katmanından tamamen ayrılır. Controllers/Models/Blocs sınıflarını widget tree'ye inject (aktarırken) ederken `MultiProvider`'lar kullanılmasına ihtiyaç yoktur. GetX'in kendine ait dependency injection özelliği sayesinde DI'yi de view'dan tamamen ayrır.
  103 +
  104 + GetX ile varsayılan olarak temiz kod kullanılarak uygulamadaki her bir özelliğin nerede bulunduğuna ulaşabilirsiniz. Bakım kolaylığının yanı sıra Flutter'da düşünüleyemeyen bir şey olan modülleri paylaşmayı tamamen mümkün kılar.
  105 + BLoC, Flutter'daki kodları organize etmenin başlangıç noktasıdır. Business logic'i, view'dan ayırır. Bunun gelişmiş hali olarak ortaya çıkan GetX sadece business logic'i ayırmakla kalmayıp aynı zamanda dependency injection'ları, route'ları ve presentation logic'i de view'dan ayırır. Data layer (Veri katmanı) bu sayede bütün katmanların dışında bırakılır. Her şeyin nerde olduğunu bilmek "hello word" oluşturmaktan çok daha kolay bir yoldur.
  106 + GetX, Flutter SDK'sı ile çok kolay, pratik ve ölçeklenebilir yüksek performanslı uygulamalar yapmanızı sağlar. Birlikte çalışılabilen büyük bir ekosistem içerir. Yeni başlayanlar için oldukça kolay ve uzmanlar için de doğru olandır. Güvenli, stabil, güncel ve Flutter SDK'da varsayılan olarak olmayan büyük kapsamlı APIs kullanabilmeyi sağlar.
  107 +
  108 +- GetX şişkin değildir. Çoklu davranış içeren özellikleri kullanarak, herhangi bir endişe olmaksızın programlamaya başlamanızı sağlar. Ancak bu özellikler farklı taraflarda olup sadece kullanıldıktan sonra başlatılır. Sadece state management kullanıyorsanız, sadece bu derlenir. Sadece routes kullanırsanız, state management'dan hiçbir şey derlenmez.
  109 +
  110 +- GetX büyük bir ekosistemdir. Geniş bir topluluk, çok sayıda destekçi içerir ve Flutter var olduğu sürece bu korunacaktır. GetX, tek bir kod ile Android, iOS, Web, Mac, Linux, Windows veya kendi server'ınız (sunucunuz) üzerinde çalışmaya elverişlidir.
  111 + **[Get Server](https://github.com/jonataslaw/get_server) ile frontend üzerinde yaptığınız kodu backend üzerinde tamamen yeniden kullanmanız mümkün**.
  112 +
  113 +**Ek olarak, tüm geliştirme süreci hem server'da hem de frontend'de [Get CLI](https://github.com/jonataslaw/get_cli) ile tamamen otomatikleştirilebilir**.
  114 +
  115 +**Ayrıca üretkenliğinizi arttırmak için
  116 +[VSCode eklentileri](https://marketplace.visualstudio.com/items?itemName=get-snippets.get-snippets) ve the [Android Studio/Intellij eklentileri](https://plugins.jetbrains.com/plugin/14975-getx-snippets) vardır.**
  117 +
  118 +# Kurulum
  119 +
  120 +pubspec.yaml dosyasına Get’i ekleyin:
  121 +
  122 +```yaml
  123 +dependencies:
  124 + get:
  125 +```
  126 +
  127 +Get’i kullanılacak sayfaya import ediyoruz:
  128 +
  129 +```dart
  130 +import 'package:get/get.dart';
  131 +```
  132 +
  133 +# GetX İle Sayaç Uygulaması
  134 +
  135 +“Sayaç” projesi yeni bir Flutter projesi oluştururken varsayılan olarak gelir. Yorum satırları ile birlikte toplam 100 satır içerir. Get’in gücünü göstermek gerekirse, size bir “sayaç” uygulamasının her bir tıklamada durumunu değiştirip, sayfalar arasında hareket edip ve bunu yaparken state'leri (durumları) aktarıp aynı zamanda organize bir yol izleyerek business logic'i view'dan ayıracağız ve bu YORUM SATIRLARI DAHİL SADECE 26 SATIR İÇERECEK.
  136 +
  137 +- 1.Adım:
  138 + “Get”’i MaterialApp’den önce GetMaterialApp'e dönüştürerek ekliyoruz.
  139 +
  140 +```dart
  141 +void main() => runApp(GetMaterialApp(home: Home()));
  142 +```
  143 +
  144 +- Not: Bu kullanım Flutter’ın sağladığı MaterialApp’i modifiye etmez. Sadece child'ı (çocuğu) MaterialApp olan ve bir öncesinde konfigüre edilmiş bir widget’tır. Kendiniz de manuel olarak konfigüre edebilirsiniz fakat buna gerek yoktur. GetMaterialApp, route’ları oluşturacak ve içine bunları, translation’ları ve route navigation için ihtiyacınız olabilecek olan her şeyi inject edecektir. Eğer Get’i sadece state management ya da dependency management olarak kullanmak isterseniz, GetMaterialApp kullanmanıza gerek yoktur. Bu yapı routes, snackbars, internationalization, bottomSheets, dialogs, ve route'lara bağlı high-level apis kullanımlarında ek olarak da context'in yokluğundaki durumlarda kullanılmalıdır.
  145 +- Not²: Bu adım sadece route management kullanıldığında gereklidir (`Get.to()`, `Get.back()` ve bunlar gibi). Kullanmayacaksanız 1. adımı yapmanıza gerek yoktur.
  146 +
  147 +- 2.Adım:
  148 + İş mantıklarını içeren sınıfı oluşturup içine tüm değişkenleri metodları ve controller'ları ekleyin.İstediğiniz herhangi bir değişkeni ".obs" ile gözlemlenebilir yapabilirsiniz.
  149 +
  150 +```dart
  151 +class Controller extends GetxController{
  152 + var count = 0.obs;
  153 + increment() => count++;
  154 +}
  155 +```
  156 +
  157 +- 3.Adım:
  158 + View'ı oluşturun ve içine StatelessWidget (bu RAM'den tasarruf sağlar) yerleştirin. Get sayesinde StatefulWidget kullanmanıza gerek yoktur.
  159 +
  160 +```dart
  161 +class Home extends StatelessWidget {
  162 +
  163 + @override
  164 + Widget build(context) {
  165 +
  166 + // Sınıfınızın nesnesini getirmek için Get.put() kullanılır. Bu içindeki tüm "child" route'ları görüntülenebilir yapar.
  167 + final Controller c = Get.put(Controller());
  168 +
  169 + return Scaffold(
  170 + // Sayaç her değiştiğinde Text() içindeki değerin güncellenmesi için Obx(()=> kullanılır
  171 + appBar: AppBar(title: Obx(() => Text("Clicks: ${c.count}"))),
  172 +
  173 + // Navigator.push içeren 8 satırı basit bir şekilde Get.to() ile değiştirin. Bunda context'e ihtiyacınız kalmamaktadır.
  174 + body: Center(child: ElevatedButton(
  175 + child: Text("Go to Other"), onPressed: () => Get.to(Other()))),
  176 + floatingActionButton:
  177 + FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment));
  178 + }
  179 +}
  180 +
  181 +class Other extends StatelessWidget {
  182 + // Önceki sayfada zaten kulllandığımız Controller'ı, Get'de "find" diyerek getirmesinini istiyoruz.
  183 + final Controller c = Get.find();
  184 +
  185 + @override
  186 + Widget build(context){
  187 + // Güncellenen sayaç değişkenine erişiyoruz.
  188 + return Scaffold(body: Center(child: Text("${c.count}")));
  189 + }
  190 +}
  191 +```
  192 +
  193 +Sonuç:
  194 +
  195 +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/counter-app-gif.gif)
  196 +
  197 +Bu basit bir proje ama Get'in ne kadar güçlü olduğunu zaten açıkça ortaya koyuyor. Projeniz büyüdükçe bu gücü daha iyi anlacaksınız.
  198 +
  199 +Get, ekiplerle çalışmak üzere tasarlanmıştır. Ayrıca bireysel geliştiricinin de işini oldukça kolaylaştırır.
  200 +
  201 +Performanstan ödün vermeden her şeyi zamanında teslim etmenize yardımcı olur. Get tam olarak sana layık!
  202 +
  203 +# Üç Temel Kavram
  204 +
  205 +## State management (Durum Yönetimi)
  206 +
  207 +Get iki farklı state manager içerir: simple state manager (GetBuilder da denilir) ve reactive state manager (GetX/Obx)
  208 +
  209 +### Reactive State Manager (Reaktif Durum Yönetimi)
  210 +
  211 +Reaktif programlama, birçok kişi tarafından karmaşık olduğu söylendiği için kafa karışıklığına yol açabilir. Ancak GetX, reaktif programlamayı oldukça basit bir hale dönüştürür:
  212 +
  213 +- StreamController'ları oluşturmanıza ihtiyacınız yoktur.
  214 +- Her bir değişken için StreamBuilder oluşturmanıza gerekmez.
  215 +- Her state için sınıf oluşturmanıza gerek yoktur.
  216 +- Başlangıç değerleri için get metodu oluşturmaya ihtiyaç olmaz.
  217 +- Code generators kullanmanız gerekmez.
  218 +
  219 +Get, reaktif programlamayı setState kullanmak kadar kolay yapmaktadır.
  220 +
  221 +Bir isim değişkeniniz olduğunu ve onu her değiştirdiğinizde, onu kullanan tüm widget'ların otomatik olarak güncellendiğini düşünün.
  222 +
  223 +Bu sizin sayaç değişkeniniz:
  224 +
  225 +```dart
  226 +var name = 'Jonatas Borges';
  227 +```
  228 +
  229 +Gözlemlenebilir yapmak için ".obs" ekliyorsunuz ve bu şekli alıyor:
  230 +
  231 +```dart
  232 +var name = 'Jonatas Borges'.obs;
  233 +```
  234 +
  235 +UI'da (kullanıcı arayüzünde) bu değeri göstermek ve değerler değiştiğinde ekranı güncellemek istediğinizde, hemen şunu yapın:
  236 +
  237 +```dart
  238 +Obx(() => Text("${controller.name}"));
  239 +```
  240 +
  241 +Hepsi bu. İşte _bu kadar_ basit.
  242 +
  243 +### State Management Hakkında Daha Fazla Bilgi
  244 +
  245 +**State Management'ın daha ayrıntılı bir açıklamasına [buradan](./documentation/en_US/state_management.md) erişebilirsiniz. Orada daha fazla örnek ile simple state manager ve reactive state manager arasındaki farkı görebilirsiniz**
  246 +
  247 +GetX'in gücü hakkında daha iyi bir fikir edineceksiniz.
  248 +
  249 +## Route Management (Rota Yönetimi)
  250 +
  251 +Eğer routes/snackbars/dialogs/bottomsheets yapılarını context'e ihtiyaç duymadan kullanmak istedğinizde, GetX bunun için biçilmiş kaftan.
  252 +
  253 +MaterialApp'i GetMaterialApp ile değiştiriyoruz.
  254 +
  255 +```dart
  256 +GetMaterialApp( // Önceki hal: MaterialApp(
  257 + home: MyHome(),
  258 +)
  259 +```
  260 +
  261 +Yeni ekrana geçmek için:
  262 +
  263 +```dart
  264 +
  265 +Get.to(NextScreen());
  266 +```
  267 +
  268 +Name (isim) ile yeni sayfaya geçiş yapılabilir. Named routes (İsimli rotalar) hakkında daha çok bilgiye [buradan](./documentation/tr_TR/route_management.md#navigation-with-named-routes) ulaşabilirsiniz.
  269 +
  270 +```dart
  271 +
  272 +Get.toNamed('/details');
  273 +```
  274 +
  275 +Snackbars, dialogs, bottomsheets ve normalde Navigator.pop(context) ile kapatacağınız herhangi bir şeyi kapatmak için;
  276 +
  277 +```dart
  278 +Get.back();
  279 +```
  280 +
  281 +Önceki ekrana geri dönme seçeneğinin olmadan bir sonraki ekrana gitmek için (örnek olarak SplashScreens, login screens, vs.)
  282 +
  283 +```dart
  284 +Get.off(NextScreen());
  285 +```
  286 +
  287 +Sonraki ekrana gitmek ve önceki tüm route'ları kapatmak için shopping carts, polls, ve test'lerde kullanılır)
  288 +
  289 +```dart
  290 +Get.offAll(NextScreen());
  291 +```
  292 +
  293 +Bunlardan herhangi birini yapmak için context kullanmanız gerekmediğini fark ettiniz mi? Get route management'ı kullanmanın en büyük avantajlarından biri de budur. Böylelikle controller sınıfınızda olan tüm metodları endişe olmadan çalıştırabilirsiniz.
  294 +
  295 +### Route Management Hakkında Daha Fazla Bilgi
  296 +
  297 +**Get, named routes ile çalışırken route'lar arası geçişleri kolayca kontrol etmenizi sağlar. Daha ayrıntılı doküman için [buraya](./documentation/tr_TR/route_management.md) tıklayabilirsiniz.**
  298 +
  299 +## Dependency Management (Bağımlılık Yönetimi)
  300 +
  301 +Get basit ve güçlü bir dependency manager içerir. Sadece tek satır kod ile Bloc ya da Controller'ınızın aynı sınıf nesnesini getirmenizi sağlar. Ayrıca Provider context, ya da inheritedWidget kullanmanıza gerek kalmaz:
  302 +
  303 +```dart
  304 +Controller controller = Get.put(Controller()); // Controller controller = Controller(); yazmak yerine
  305 +```
  306 +
  307 +- Not: Get'in State Manager'ını kullanıyorsanız, API bağlamaya daha çok dikkat edin ki onlar view'ı controller'a kolayca bağlamanızı sağlayacaktır.
  308 +
  309 +Kullanacağınız sınıfın içinde başka bir sınıfın nesnesini oluşturmak yerine, Get instance sayesinde uygulamanızın her yerinde aynı sınıf nesnesini kullanabilir hale getirebilirsiniz.
  310 +Böylelikle controller (ya da Bloc sınıfını) normal bir şekilde kullanabilirsiniz.
  311 +
  312 +**İpucu:** Get dependency management, kütüphanenin diğer parçalarından ayrıdır. Örnek olarak eğer uygulamanızda hali hazırda state manager kullanıyorsanız (hangisi olduğu fark etmez), en baştan yazmaya gerek yoktur. Bu dependency injection'ı problem olmadan kullanabilirsiniz.
  313 +
  314 +```dart
  315 +controller.fetchApi();
  316 +```
  317 +
  318 +Farzedin ki çok fazla sayıda route'larınız ve controller'larınızda erişmeniz gereken data'lar olsun, state manager'ı Provider ya da Get_it gibi kütüphaneler ile bağlamanız gerekmekedir. Get kullanarak bunları bağlamaya ihtiyacınız kalmaz. Get'e sadece "find" diyerek controller'ınızı bulmasını istemeniz yeterlidir. Fazladan dependency'lere ihtiyacınız yoktur:
  319 +
  320 +```dart
  321 +Controller controller = Get.find();
  322 +// Evet, inanılmaz değil mi? Get, controller'ınızı bulup getirecek. Get, milyonlarca controller tanımlanmış da olsa size her zaman doğrusunu getirecektir.
  323 +```
  324 +
  325 +Sonrasında üstte alınan controller'daki verilerinizi kullanabileceksiniz:
  326 +
  327 +```dart
  328 +Text(controller.textFromApi);
  329 +```
  330 +
  331 +### Dependency Management Hakkında Daha Fazla Bilgi
  332 +
  333 +**Dependency management'a daha derinden bakmak için [buraya](./documentation/tr_TR/dependency_management.md) tıklayabilirsiniz**
  334 +
  335 +# Utils
  336 +
  337 +## Internationalization (Uluslararasılaştırma)
  338 +
  339 +### Translations (Çeviriler)
  340 +
  341 +Translations, map halinde basit key-value değerleri tutar.
  342 +Özel translation'larınızı eklemek için bir sınıf oluşturup `Translations`sınıfını extend edebilirsiniz.
  343 +
  344 +```dart
  345 +import 'package:get/get.dart';
  346 +
  347 +class Messages extends Translations {
  348 + @override
  349 + Map<String, Map<String, String>> get keys => {
  350 + 'en_US': {
  351 + 'hello': 'Hello World',
  352 + },
  353 + 'de_DE': {
  354 + 'hello': 'Hallo Welt',
  355 + }
  356 + };
  357 +}
  358 +```
  359 +
  360 +#### Translations kullanımı
  361 +
  362 +Önecen belirlenmiş key'e sadece `.tr` eklenince `Get.locale` ve `Get.fallbackLocale` şimdiki değerleri kullanarak otomatik çeviriyi yapacaktır.
  363 +
  364 +
  365 +```dart
  366 +Text('title'.tr);
  367 +```
  368 +
  369 +#### Tekil ve çoğul çevirisi yapımı
  370 +
  371 +```dart
  372 +var products = [];
  373 +Text('singularKey'.trPlural('pluralKey', products.length, Args));
  374 +```
  375 +
  376 +#### Parametreler ile çeviri yapımı
  377 +
  378 +```dart
  379 +import 'package:get/get.dart';
  380 +
  381 +
  382 +Map<String, Map<String, String>> get keys => {
  383 + 'en_US': {
  384 + 'logged_in': 'logged in as @name with email @email',
  385 + },
  386 + 'es_ES': {
  387 + 'logged_in': 'iniciado sesión como @name con e-mail @email',
  388 + }
  389 +};
  390 +
  391 +Text('logged_in'.trParams({
  392 + 'name': 'Jhon',
  393 + 'email': 'jhon@example.com'
  394 + }));
  395 +```
  396 +
  397 +### Locales (Yerel Ayarlar)
  398 +
  399 +Locale ve translation'lar`GetMaterialApp`'in parametreleri içinde atanabilir.
  400 +
  401 +```dart
  402 +return GetMaterialApp(
  403 + translations: Messages(), //Çevirileriniz
  404 + locale: Locale('en', 'US'), //Çeviriler bu locale dilinde gösterilecek
  405 + fallbackLocale: Locale('en', 'UK'), // Eğer yanlış bir locale olması durumunda gösterilecek fallback locale
  406 +);
  407 +```
  408 +
  409 +#### Locale değiştirmek
  410 +
  411 +`Get.updateLocale(locale)` çağrılarak locale güncellenebilir. Çeviriler otomatik olarak yeni locale dilinde olacaktır.
  412 +
  413 +```dart
  414 +var locale = Locale('en', 'US');
  415 +Get.updateLocale(locale);
  416 +```
  417 +
  418 +#### System locale (Yerel Sistem Ayarları)
  419 +
  420 +Sistem locale'i okumak için `Get.deviceLocale` kullanılır.
  421 +
  422 +```dart
  423 +return GetMaterialApp(
  424 + locale: Get.deviceLocale,
  425 +);
  426 +```
  427 +
  428 +## Tema Değiştirme
  429 +
  430 +Güncellemek için`GetMaterialApp`'in üstüne bir widget koymayın. Bu, kopya key'ler oluşmasını tetikler. Birçok kişi tema değiştirmek için tarih öncesi bir yöntem olan "ThemeProvider" widget'ı oluşturmayı tercih eder. **GetX™** ile buna HİÇ gerek duyulmaz.
  431 +
  432 +`Get.changeTheme`ile kendi oluşturduğunuz temanızı hızlı bir şekilde ekleyebilirsiniz:
  433 +
  434 +```dart
  435 +Get.changeTheme(ThemeData.light());
  436 +```
  437 +
  438 +`onTap`'de Temayı değiştiren bir buton oluşturmak istiyorsanız, bunun için iki **GetX™** API'sini birleştirebilirsiniz:
  439 +
  440 +- API, karanlık `Theme`'in kullanıp kullanılmadığını kontrol eder.
  441 +- `Theme` Change API'yi `onPressed`içine koyabilirsiniz:
  442 +
  443 +```dart
  444 +Get.changeTheme(Get.isDarkMode? ThemeData.light(): ThemeData.dark());
  445 +```
  446 +
  447 +`.darkmode` aktif hale geldiğinde, tıklandığında _light theme_ 'e döner, _light theme_ aktif olduğunda, _dark theme_'e geçer.
  448 +
  449 +## GetConnect
  450 +
  451 +GetConnect backend ile frontend'in http ya da websockets ile kolayca iletişime geçmesini sağlar.
  452 +
  453 +### Varsayılan Ayarlar
  454 +
  455 +Sadece GetConnect'den extend ederek gelen GET/POST/PUT/DELETE/SOCKET metodlarını kullanarak Rest API ya da websockets ile kolayca iletişim kurabilirsiniz.
  456 +
  457 +```dart
  458 +class UserProvider extends GetConnect {
  459 + // Get request
  460 + Future<Response> getUser(int id) => get('http://youapi/users/$id');
  461 + // Post request
  462 + Future<Response> postUser(Map data) => post('http://youapi/users', body: data);
  463 + // File ile Post request
  464 + Future<Response<CasesModel>> postCases(List<int> image) {
  465 + final form = FormData({
  466 + 'file': MultipartFile(image, filename: 'avatar.png'),
  467 + 'otherFile': MultipartFile(image, filename: 'cover.png'),
  468 + });
  469 + return post('http://youapi/users/upload', form);
  470 + }
  471 +
  472 + GetSocket userMessages() {
  473 + return socket('https://yourapi/users/socket');
  474 + }
  475 +}
  476 +```
  477 +
  478 +### Özel Ayarlamalar
  479 +
  480 +GetConnect oldukça düzenlenebilir. Kendi base Url'nizi tanımlayabilir, cevapları ve Request'leri düzenleyebilirsiniz. Authenticator oluşturup kendiliğinden authenticate olmasını sağlayabilirsiniz. Size verilen standart decoder ile tüm request'leri ek bir ayar olmadan modellerinize aktarabilirsiniz.
  481 +
  482 +```dart
  483 +class HomeProvider extends GetConnect {
  484 + @override
  485 + void onInit() {
  486 + // Tüm request'ler jsonEncode'a gider: CasesModel.fromJson()
  487 + httpClient.defaultDecoder = CasesModel.fromJson;
  488 + httpClient.baseUrl = 'https://api.covid19api.com';
  489 + // baseUrl = 'https://api.covid19api.com'; //baseUrl'yi bu şekilde tanımlar
  490 + // Http ve websockets kullanılmış ise [httpClient] instance'ına ihtiyaç yoktur.
  491 +
  492 +
  493 + // Gelen tüm request'ler "apikey"'in header özelliğine gier.
  494 + httpClient.addRequestModifier((request) {
  495 + request.headers['apikey'] = '12345678';
  496 + return request;
  497 + });
  498 +
  499 + // Eğer sunucu "Brazilya"'dan bir veri gönderse bile
  500 + // response'dan veriyi kaldırdığın için kullanıcılar göremez.
  501 + // response önceden getirişmiş olsa bile
  502 + httpClient.addResponseModifier<CasesModel>((request, response) {
  503 + CasesModel model = response.body;
  504 + if (model.countries.contains('Brazil')) {
  505 + model.countries.remove('Brazilll');
  506 + }
  507 + });
  508 +
  509 + httpClient.addAuthenticator((request) async {
  510 + final response = await get("http://yourapi/token");
  511 + final token = response.body['token'];
  512 + // header veriliyor
  513 + request.headers['Authorization'] = "$token";
  514 + return request;
  515 + });
  516 +
  517 + // HttpStatus, HttpStatus.unauthorized ise
  518 + // Autenticator 3 defa çağırılır.
  519 + httpClient.maxAuthRetries = 3;
  520 + }
  521 + }
  522 +
  523 + @override
  524 + Future<Response<CasesModel>> getCases(String path) => get(path);
  525 +}
  526 +```
  527 +
  528 +## GetPage Middleware
  529 +
  530 +GetPage'in GetMiddleWare listesi oluşturan ve bunları özel bir sırada çalıştıran bir özelliği vardır.
  531 +
  532 +**Not**: GetPage, Middlewares içeriyor ise bu sayfanın tüm çocukları da aynı middlewares'i otomatik olarak içerir.
  533 +
  534 +### Priority (Öncelik)
  535 +
  536 +Middlewares'in sıralı çalışması için GetMiddleware'lerin priority'leri (öncelikleri) düzenlenmelidir.
  537 +
  538 +```dart
  539 +final middlewares = [
  540 + GetMiddleware(priority: 2),
  541 + GetMiddleware(priority: 5),
  542 + GetMiddleware(priority: 4),
  543 + GetMiddleware(priority: -8),
  544 +];
  545 +```
  546 +
  547 +Middleware'ler bu sırada çalışacaktır: **-8 => 2 => 4 => 5**
  548 +
  549 +### Redirect (Yönlendirme)
  550 +
  551 + Çağrılan route'un sayfası arandığında, fonsyon çağırılmış olacaktır. Redirect için RouteSettings kullanılır. Name değeri null verilebilir ve bu olduğu zaman herhangi bir redirect olmayacaktır.
  552 +
  553 +```dart
  554 +RouteSettings redirect(String route) {
  555 + final authService = Get.find<AuthService>();
  556 + return authService.authed.value ? null : RouteSettings(name: '/login')
  557 +}
  558 +```
  559 +
  560 +### onPageCalled
  561 +
  562 +Bu fonsyon, herhangi bir şey oluşmadan önce sayfa çağırılmak istenildiğinde kullanılır. Sayfada bir şey değiştirmek için ya da yeni bir sayfa vermek için kullanabilirsiniz.
  563 +
  564 +```dart
  565 +GetPage onPageCalled(GetPage page) {
  566 + final authService = Get.find<AuthService>();
  567 + return page.copyWith(title: 'Welcome ${authService.UserName}');
  568 +}
  569 +```
  570 +
  571 +### OnBindingsStart
  572 +
  573 +Bu fonsyon Bindings başlatılmadan hemen önce çalışır.
  574 +Bu sayfa için Bindings'i şu şekilde değiştirebilirsiniz.
  575 +
  576 +```dart
  577 +List<Bindings> onBindingsStart(List<Bindings> bindings) {
  578 + final authService = Get.find<AuthService>();
  579 + if (authService.isAdmin) {
  580 + bindings.add(AdminBinding());
  581 + }
  582 + return bindings;
  583 +}
  584 +```
  585 +
  586 +### OnPageBuildStart
  587 +
  588 +Bu fonsyon Bindings başlatıldıktan hemen sonra çalışır.
  589 +Bindings oluşturulduktan hemen sonra ve widget sayfası oluşturulmadan önce kullanabilirsiniz.
  590 +
  591 +```dart
  592 +GetPageBuilder onPageBuildStart(GetPageBuilder page) {
  593 + print('bindings are ready');
  594 + return page;
  595 +}
  596 +```
  597 +
  598 +### OnPageBuilt
  599 +
  600 +Bu fonskyon GetPage.page fonskyonu çağrıldıktan hemen sonra çalışır ve fonksyonun sonucunu verir. Sonrasında gösterilecek widget'ı alır.
  601 +
  602 +### OnPageDispose
  603 +
  604 +Bu fonsyon sayfadaki ilgili tüm objelerin (Controllers, views, ...) dispose olmasından hemen sonra çalışır.
  605 +
  606 +## Advanced APIs (Gelişmiş API'ler)
  607 +
  608 +```dart
  609 +// currentScreen'deki arg'ı verir
  610 +Get.arguments
  611 +
  612 +// Önceki route'un name'ini verir.
  613 +Get.previousRoute
  614 +
  615 +// Erişmek için raw route'u verir. Örnek olarak: rawRoute.isFirst()
  616 +Get.rawRoute
  617 +
  618 +// GetObserver'dan Routing API'ye erişim verir.
  619 +Get.routing
  620 +
  621 +// Snackbar açık mı kontrolü yaplır.
  622 +Get.isSnackbarOpen
  623 +
  624 +// Dialog açık mı kontrolü yaplır.
  625 +Get.isDialogOpen
  626 +
  627 +// Bottomsheet açık mı kontrolü yaplır.
  628 +Get.isBottomSheetOpen
  629 +
  630 +// Tek route kaldırılır.
  631 +Get.removeRoute()
  632 +
  633 +// predicate, true döndürene kadar terarlanarak geri gelir.
  634 +Get.until()
  635 +
  636 +// Yeni route a gider ve eski tüm route'ları, predicate, true döndürene kadar kaldırır.
  637 +Get.offUntil()
  638 +
  639 +// named route'a gider ve eski tüm route'ları, predicate, true döndürene kadar kaldırır.
  640 +Get.offNamedUntil()
  641 +
  642 +//Hangi platformda çalıştığı kontrol edilir.
  643 +GetPlatform.isAndroid
  644 +GetPlatform.isIOS
  645 +GetPlatform.isMacOS
  646 +GetPlatform.isWindows
  647 +GetPlatform.isLinux
  648 +GetPlatform.isFuchsia
  649 +
  650 +//Cihaz türü kontrol edilir.
  651 +GetPlatform.isMobile
  652 +GetPlatform.isDesktop
  653 +//Web'de tüm platformlar bağımsız olarak desteklenir!
  654 +//Bir tarayıcının içinde çalışıp çalışmadığınızı anlayabilirsiniz
  655 +//Windows, iOS, OSX, Android, vs. gibi
  656 +GetPlatform.isWeb
  657 +
  658 +
  659 +// Aşağıdakine eşittir : MediaQuery.of(context).size.height,
  660 +// fakat immutable'dır (sabittir).
  661 +Get.height
  662 +Get.width
  663 +
  664 +// Navigator'e şimdiki context'i verir.
  665 +Get.context
  666 +
  667 +// Önde olan snackbar/dialog/bottomsheet'a nerede olursanız olun context'i verir.
  668 +Get.contextOverlay
  669 +
  670 +// Not: aşağıdaki metodlar context üzerine olan extension'lardır.
  671 +// UI'ın herhangi bir yerinde context'e erişebilirsiniz ve istediğiniz yerde kullanabilirsiniz.
  672 +
  673 +// Eğer değişken bir height/width verileri varsa (örnek olarak Masaüstü ya da tarayıcı gibi ölçeği değişebilen pencereler) context'i kullanmaya ihtiyacınız vardır.
  674 +context.width
  675 +context.height
  676 +
  677 +// Size ekranın yarısını, üçte birini vb. tanımlamayı sağlar.
  678 +// Responsive uygulamalar için kullanışlıdır.
  679 +// param dividedBy (double) optional - default: 1
  680 +// param reducedBy (double) optional - default: 0
  681 +context.heightTransformer()
  682 +context.widthTransformer()
  683 +
  684 +/// MediaQuery.of(context).size'a benzer
  685 +context.mediaQuerySize()
  686 +
  687 +/// MediaQuery.of(context).padding'e benzer
  688 +context.mediaQueryPadding()
  689 +
  690 +/// MediaQuery.of(context).viewPadding'e benzer
  691 +context.mediaQueryViewPadding()
  692 +
  693 +/// MediaQuery.of(context).viewInsets;'e benzer
  694 +context.mediaQueryViewInsets()
  695 +
  696 +/// MediaQuery.of(context).orientation;'a benzer
  697 +context.orientation()
  698 +
  699 +/// Cihazın yatay modda olup olmadığını kontrol eder.
  700 +context.isLandscape()
  701 +
  702 +/// Cihazın dikey modda olup olmadığını kontrol eder.
  703 +context.isPortrait()
  704 +
  705 +/// MediaQuery.of(context).devicePixelRatio;'ya benzer
  706 +context.devicePixelRatio()
  707 +
  708 +/// MediaQuery.of(context).textScaleFactor;'e benzer
  709 +context.textScaleFactor()
  710 +
  711 +/// Ekranın en kısa kenarını getirir
  712 +context.mediaQueryShortestSide()
  713 +
  714 +/// width 800'den büyük ise true döndürür.
  715 +context.showNavbar()
  716 +
  717 +/// Kısa kenar 600p'den küçük ise true döndürür.
  718 +context.isPhone()
  719 +
  720 +/// Kısa kenar 600p'den büyük ise true döndürür.
  721 +context.isSmallTablet()
  722 +
  723 +/// Kısa kenar 720p'den büyük ise true döndürür.
  724 +context.isLargeTablet()
  725 +
  726 +/// Cihaz tablet ise true döndürür.
  727 +context.isTablet()
  728 +
  729 +/// Ekran boyutuna göre <T> değerini döndürür
  730 +/// için değer verebilir:
  731 +/// watch: Kısa kenar 300'den küçük ise
  732 +/// mobile: Kısa kenar 600'den küçük ise
  733 +/// tablet: Kısa kenar 1200'den küçük ise
  734 +/// desktop: width 1200'den büyük ise
  735 +
  736 +context.responsiveValue<T>()
  737 +```
  738 +
  739 +### Opsiyonel Genel Ayarlar ve Manuel Ayarlamalar
  740 +
  741 +GetMaterialApp çoğu şeyi sizin için otomatik olarak ayarlar, ayrıca kendiniz de isterseniz Get'i manuel olarak ayarlayabilirsiniz.
  742 +
  743 +```dart
  744 +MaterialApp(
  745 + navigatorKey: Get.key,
  746 + navigatorObservers: [GetObserver()],
  747 +);
  748 +```
  749 +
  750 +`GetObserver` içinde kendi Middleware'ınızı kullanabilirsiniz ve bu hiçbir şeyi etkilemez.
  751 +
  752 +```dart
  753 +MaterialApp(
  754 + navigatorKey: Get.key,
  755 + navigatorObservers: [
  756 + GetObserver(MiddleWare.observer) // Burası
  757 + ],
  758 +);
  759 +```
  760 +
  761 +`Get` için _Global Settings_ oluşturabilirsiniz. Herhangi bir route'a push yapmadan önce kodunuza `Get.config` eklemeniz yeterli.
  762 +Ya da doğrudan `GetMaterialApp` içinde tanımlayabilirsiniz.
  763 +
  764 +```dart
  765 +GetMaterialApp(
  766 + enableLog: true,
  767 + defaultTransition: Transition.fade,
  768 + opaqueRoute: Get.isOpaqueRouteDefault,
  769 + popGesture: Get.isPopGestureEnable,
  770 + transitionDuration: Get.defaultDurationTransition,
  771 + defaultGlobalState: Get.defaultGlobalState,
  772 +);
  773 +
  774 +Get.config(
  775 + enableLog = true,
  776 + defaultPopGesture = true,
  777 + defaultTransition = Transitions.cupertino
  778 +)
  779 +```
  780 +
  781 +İsteğe bağlı olarak tüm logging mesajlarını `Get` üzerinden yönlendirebilirsiniz.
  782 +Kendi istediğiniz logging paketinizi kullanmak
  783 +ve oradaki log'ları yakalamak istiyorsanız:
  784 +
  785 +```dart
  786 +GetMaterialApp(
  787 + enableLog: true,
  788 + logWriterCallback: localLogWriter,
  789 +);
  790 +
  791 +void localLogWriter(String text, {bool isError = false}) {
  792 + // istediğiniz logging paketine mesajı aktarır
  793 + // eğer, enableLog: false ise log mesajları bu callback içine gönderilir
  794 + // GetConfig.isLogEnable aracılığıyla isterseniz kontrol edebilirsiniz
  795 +}
  796 +
  797 +```
  798 +
  799 +### Local State Widgets (Yerel Durum Widgetları)
  800 +
  801 +Bu widget'lar tek bir değeri kontrol etmenize ve durumu geçici ya da yerel olarak tutmanızı sağlar.
  802 +Reactive ve simple olan yapılar içerir.
  803 +Örneğin bunları `TextField` içindeki obscureText parametresine bağlayabilirsiniz. İsterseniz kendinizinkini (Expandable Panel vs.) de oluşturabilirsiniz ya da `Scaffold`'daki body'nin içeriği değişirken `BottomNavigationBar` içindeki current index'i değiştirebilirsiniz.
  804 +
  805 +#### ValueBuilder
  806 +
  807 +Veri güncellemenin bir yolu olan `StatefulWidget`'daki `.setState` yapısının basitleştirilmiş halidir.
  808 +
  809 +```dart
  810 +ValueBuilder<bool>(
  811 + initialValue: false,
  812 + builder: (value, updateFn) => Switch(
  813 + value: value,
  814 + onChanged: updateFn, // tamamen aynısı! ( newValue ) => updateFn( newValue ) yapısını da kullanabilirsiniz
  815 + ),
  816 + // eğer builder metodu dışından bir çağırma işlemi yapılacak ise
  817 + onUpdate: (value) => print("Value updated: $value"),
  818 + onDispose: () => print("Widget unmounted"),
  819 +),
  820 +```
  821 +
  822 +#### ObxValue
  823 +
  824 +[`ValueBuilder`](#valuebuilder)'a oldukça benzer olmasının yanında bu Reactive halidir. Rx nesnesine aktarabilir ( .obs yapısını hatıladınız mı?) ve otomatik olarak güncellenmensini sağlayabilirsiniz, resmen muhteşem değil mi ?
  825 +
  826 +```dart
  827 +ObxValue((data) => Switch(
  828 + value: data.value,
  829 + onChanged: data, // Rx, çağrılabilen fonsyon içerir. (flag) => data.value = flag şeklinde kullanılablir.
  830 + ),
  831 + false.obs,
  832 +),
  833 +```
  834 +
  835 +## Faydalı İpuçları
  836 +
  837 +`.obs` yapıları olan gözlemlenebilirler ( _Rx_ tipleri olarak da bilinirler) oldukça çeşitli internal metodlara ve operatörlere sahiptirler.
  838 +
  839 +> `.obs` yapısının gerçek değer olduğunu düşünenler oldukça yaygındır fakat bu yanlış bir düşüncedir.
  840 +> Değişkenleri, Type declaration yapmaktan kaçınmalıyız. Çünkü Dart'ın derleyicisi zaten bunu anlayacak kadar zekidir.
  841 +> Kodunuzu daha temiz gösterir fakat:
  842 +
  843 +```dart
  844 +var message = 'Hello world'.obs;
  845 +print( 'Message "$message" has Type ${message.runtimeType}');
  846 +```
  847 +
  848 +`message`, gerçek String Type değerini yazdırsa bile aslında bu bir **RxString** Type değeridir!
  849 +
  850 +Yani `message.substring( 0, 4 )` şeklinde kullanmazsınız.
  851 + _observable_ içindeki gerçek `value`'ya (değere) erişmelisiniz.
  852 +En çok "kullanılan yol" `.value` yapısı ile erişmektir fakat şu şekilde kullanabileceğiniz bir yol daha var...
  853 +
  854 +
  855 +```dart
  856 +final name = 'GetX'.obs;
  857 +// eğer değer şimdikinden farklı ise, sadece stream'i "günceller"
  858 +name.value = 'Hey';
  859 +
  860 +// Tüm Rx özellikleri "çağrılabilir" ve geriye yeni bir değer döndürür.
  861 +// Fakat bu yaklaşım `null` değerleri kabul etmez, sonucunda UI rebuild (tekrardan oluşturulmaz) edilmez.
  862 +name('Hello');
  863 +
  864 +// getter yapmak gibi, 'Hello'yazdırır.
  865 +
  866 +name() ;
  867 +
  868 +/// numbers:
  869 +
  870 +final count = 0.obs;
  871 +
  872 +// Tüm non mutable (değişken olmayan) işlemleri num primitives üzerinden yapabilirsiniz.
  873 +count + 1;
  874 +
  875 +// Dikkat edin! Bu sadece `count` değerinin 'final' olmayıp 'var' olduğu değerlerde mümkündür.
  876 +count += 1;
  877 +
  878 +// Ayrıca değerleri kıyaslayabilirsiniz:
  879 +count > 2;
  880 +
  881 +/// booleans:
  882 +
  883 +final flag = false.obs;
  884 +
  885 +// değer true/false arasında değişir.
  886 +flag.toggle();
  887 +
  888 +
  889 +/// tüm tipler için:
  890 +
  891 +// "value"'ları null'a çevirir.
  892 +flag.nil();
  893 +
  894 +// Tüm toString(), toJson() işlemleri `value`'ya aktarılır.
  895 +print( count ); // RxInt içinden `toString()` çağrılır.
  896 +
  897 +final abc = [0,1,2].obs;
  898 +// Değeri bir json Array (dizi) yapısına çevirir ve RxList şeklinde yazdırır.
  899 +// Json tüm Rx tipleri tarafından desteklenir.
  900 +print('json: ${jsonEncode(abc)}, type: ${abc.runtimeType}');
  901 +
  902 +// RxMap, RxList ve RxSet kendi native tiplerinden extend edilen özel Rx tipleridir.
  903 +// Fakat List ile çalışmak normal listelerle çalışmak gibidir. Reaktiv olmasına rağmen.
  904 +abc.add(12); // '12' listeye eklenir ve stream GÜNCELLENİR.
  905 +abc[3]; // List'deki gibi 3. index okunur.
  906 +
  907 +
  908 +// Rx ve value ile çalışmak aynıdır fakat hashCode her zaman value'dan alınır.
  909 +final number = 12.obs;
  910 +print( number == 12 ); // çıktı: true
  911 +
  912 +/// Özel Rx Modelleri:
  913 +
  914 +
  915 +// toJson(), toString() child'a gönderilir. Böylelikle override'ları onlara implement edebilirsiniz ve doğrudan gözlemlenebiliri print() edebilirsiniz.
  916 +
  917 +class User {
  918 + String name, last;
  919 + int age;
  920 + User({this.name, this.last, this.age});
  921 +
  922 + @override
  923 + String toString() => '$name $last, $age years old';
  924 +}
  925 +
  926 +final user = User(name: 'John', last: 'Doe', age: 33).obs;
  927 +
  928 +// `user`,"reactive" yapıdadır. Fakat içinde özellikleri DEĞİLDİR.
  929 +// Yani eğer içindeki bazı değerleri değiştirirsek
  930 +user.value.name = 'Roi';
  931 +//widget, rebuild olmayacaktır!,
  932 +//`Rx`, user içindeki bir şeyi değiştirdiğinizde, bundan haberi olmayacaktır.
  933 +// Özel sınıflar oluşturmak için, manuel olarak değişiklikleri "notify" etmeliyiz.
  934 +user.refresh();
  935 +
  936 +// Ya da `update()` metodunu kullanabiliriz
  937 +user.update((value){
  938 + value.name='Roi';
  939 +});
  940 +
  941 +print( user );
  942 +```
  943 +## StateMixin
  944 +
  945 +`UI` state ile başa çıkmanın başka bir yolu da `StateMixin<T>` kullanmaktır.
  946 +Bunu implement yapmak için, controller'ınıza `with` kullanarak yanına `StateMixin<T>` eklemekle olur.
  947 +Bu sizin T modelini kullanmanızı sağlar.
  948 +
  949 +
  950 +``` dart
  951 +class Controller extends GetController with StateMixin<User>{}
  952 +```
  953 +
  954 +`change()` metodu istediğiniz yerde State'i değiştirmemizi sağlar.
  955 +Veri(data) ve durum(status) aktarmak için kullanılan yol:
  956 +
  957 +```dart
  958 +change(data, status: RxStatus.success());
  959 +```
  960 +
  961 +RxStatus şu durumları kullanmanızı sağlar:
  962 +
  963 +``` dart
  964 +RxStatus.loading();
  965 +RxStatus.success();
  966 +RxStatus.empty();
  967 +RxStatus.error('message');
  968 +```
  969 +
  970 +UI'ın içinde temsil edilmesi için şu şekilde kullanılır:
  971 +
  972 +```dart
  973 +class OtherClass extends GetView<Controller> {
  974 + @override
  975 + Widget build(BuildContext context) {
  976 + return Scaffold(
  977 +
  978 + body: controller.obx(
  979 + (state)=>Text(state.name),
  980 +
  981 + // Kendi yüklenme göstergenizi (loading indicator) buraya eklebilirsiniz
  982 + // hali hazırda gelen yapı şudur: Center(child:CircularProgressIndicator())
  983 + onLoading: CustomLoadingIndicator(),
  984 + onEmpty: Text('No data found'),
  985 +
  986 + // Keni hata widget'ınızı buraya yazabilirsiniz
  987 + // hali hazırda gelen yapı şudur: Center(child:Text(error))
  988 + onError: (error)=>Text(error),
  989 + ),
  990 + );
  991 +}
  992 +```
  993 +
  994 +#### GetView
  995 +
  996 +Bu widget'ı çok seviyorum, oldukça basit ve çok kullanışlı!
  997 +
  998 +`const Stateless` Widget, `Controller`'ı tanımlamak için `controller` özelliği içerir.
  999 +
  1000 +```dart
  1001 + class AwesomeController extends GetController {
  1002 + final String title = 'My Awesome View';
  1003 + }
  1004 +
  1005 + // controller'ınızı register etmek için bunu kullandığınız `Type`'a geçirmeyi asla unutmayın.
  1006 + class AwesomeView extends GetView<AwesomeController> {
  1007 + @override
  1008 + Widget build(BuildContext context) {
  1009 + return Container(
  1010 + padding: EdgeInsets.all(20),
  1011 + child: Text(controller.title), // sadece `controller.something` deyin
  1012 + );
  1013 + }
  1014 + }
  1015 +```
  1016 +
  1017 +#### GetResponsiveView
  1018 +
  1019 +Responsive view oluşturmak için bu widget'tan extend edilir.
  1020 +Bu widget ekran size ve type hakkında bilgiler içeren
  1021 +`screen` özelliğini taşır.
  1022 +
  1023 +##### Nasıl kullanılır?
  1024 +
  1025 +build yapmanız için 2 yönteminiz vardır.
  1026 +
  1027 +- build yapmak için `builder` metodu ile widget döndürmek
  1028 +- `desktop`, `tablet`,`phone`, `watch` metodları ile
  1029 + bu özel metodlar ekran türü bu metodlarla eşitlendiiği zaman build metodunu tetikler.
  1030 + Mesela ekran [ScreenType.Tablet] ise `tablet` metodu çalışrıtılacaktır.
  1031 + **Not:** Eğer bu metodu kullanırsanız, lütfen `alwaysUseBuilder` özelliğini `false` olarak işaretleyin.
  1032 +
  1033 +`settings` özelliği sayesinde ekranın türüne göre genişlik limiti koyabilirsiniz.
  1034 +
  1035 +![örnek](https://github.com/SchabanBo/get_page_example/blob/master/docs/Example.gif?raw=true)
  1036 +Bu ekranın kodları
  1037 +[burada](https://github.com/SchabanBo/get_page_example/blob/master/lib/pages/responsive_example/responsive_view.dart)
  1038 +
  1039 +#### GetWidget
  1040 +
  1041 +Çoğu kişinin widget'lar hakkında hiçbir fikri yok ya da kullanırken inanılmaz kafası karışıyor.
  1042 +Bu kullanım oldukça nadir fakat özel: Controller `caches`'leme işlemi _cache_ yüzünden asla bir `const Stateless` oluşamaz.
  1043 +
  1044 +> Peki ne zaman Controller'ı "cache"'yemeye ihtiyacınız olacak?
  1045 +
  1046 +"Çok da yaygın olmayan" bir **GetX** özelliğini kullanıyorsanız: `Get.create()`.
  1047 +
  1048 +`Get.create(()=>Controller())` yapısı siz her `Get.find<Controller>()` dediğinizde size yeni bir `Controller` oluşturacak.
  1049 +
  1050 +`GetWidget`'ın ışığı burada parlıyor. Örnek olarak bir listede
  1051 +
  1052 +Todo ögelerini tutmak istiyorsanız kullanılır. Eğer widget'ın "rebuilt" olursa, yapı yine aynı controller nesnesini tutmaya devam edecektir.
  1053 +
  1054 +#### GetxService
  1055 +
  1056 +Bu sınıf `GetxController`' bezer. Uygulamanın lifecycle'larını (hayat döngüsü metodlarını) içerir ( `onInit()`, `onReady()`, `onClose()`).
  1057 +Fakat içinde hiçbir mantıksal yapı bulunmaz. Sadece **GetX**'in Dependency Injection sistemini bilgilendirir.
  1058 +
  1059 +Bunun alt sınıfları, memory (bellekten) hiçbir şekilde **kaldırılamaz**.
  1060 +
  1061 +
  1062 +Bu yöntem "Servislerinizi" tutmak için oldukça kullanışlıdır. Servisleriniz bu şekilde her zaman ulaşılabilir ve aktif olur. `Get.find()` metodu buna yeter. Örnek olarak:`ApiService`, `StorageService`, `CacheService`.
  1063 +
  1064 +
  1065 +```dart
  1066 +Future<void> main() async {
  1067 + await initServices(); /// SERVİSLERİN BAŞLATILMASI BEKLENİR
  1068 + runApp(SomeApp());
  1069 +}
  1070 +
  1071 +/// Servislerinizi Flutter uygulaması çalışmadan önce başlatılması oldukça mantıklı bir harekettir.
  1072 +/// Uygulama akışını kontrol edebilirsiniz. (belki de birkaç tane Tema düzenlemesi ya da
  1073 +/// apiKey, kulllanıcıdan gelen dil tanımlaması gibi düzenlemeler yapmanız lazımdır...Bu durumna SettingService'i ApiService'den önce çalışması gerekmektedir.
  1074 +/// GetMaterialApp() 'in rebuild yapmasına gerek yoktur. Çünkü değerleri doğrudan alır.
  1075 +void initServices() async {
  1076 + print('starting services ...');
  1077 + /// Burası sizin get_storage, hive, shared_pref gibi yükelemeleri yaptığınız yer.
  1078 + /// ya da daha fazla özellik bağlamak ve ya async yapıları kullanmak için
  1079 + await Get.putAsync(() => DbService().init());
  1080 + await Get.putAsync(SettingsService()).init();
  1081 + print('All services started...');
  1082 +}
  1083 +
  1084 +class DbService extends GetxService {
  1085 + Future<DbService> init() async {
  1086 + print('$runtimeType delays 2 sec');
  1087 + await 2.delay();
  1088 + print('$runtimeType ready!');
  1089 + return this;
  1090 + }
  1091 +}
  1092 +
  1093 +class SettingsService extends GetxService {
  1094 + void init() async {
  1095 + print('$runtimeType delays 1 sec');
  1096 + await 1.delay();
  1097 + print('$runtimeType ready!');
  1098 + }
  1099 +}
  1100 +
  1101 +```
  1102 +
  1103 +`GetxService`'lerini silmenin tek bir yolu vardır o da `Get.reset()`.
  1104 +Bu yöntem uygulamanıza "Hot Reboot" yapmak gibidir. Eğer uygulamanızın hayat süresi boyunca mutlaka kalıcılığı olmasını istediğiniz bir sınıfın nesnesini oluşturmak istediğiniz zaman `GetxService`'i kullanın.
  1105 +
  1106 +
  1107 +### Testler
  1108 +
  1109 +Controller'larınızı lifecycle'ları (hayat döngüleri) dahil olmak üzere diğer sınıflar gibi test edebilirsiniz:
  1110 +
  1111 +```dart
  1112 +class Controller extends GetxController {
  1113 + @override
  1114 + void onInit() {
  1115 + super.onInit();
  1116 + //Değeri name2 ile değiştirme
  1117 +
  1118 + name.value = 'name2';
  1119 + }
  1120 +
  1121 + @override
  1122 + void onClose() {
  1123 + name.value = '';
  1124 + super.onClose();
  1125 + }
  1126 +
  1127 + final name = 'name1'.obs;
  1128 +
  1129 + void changeName() => name.value = 'name3';
  1130 +}
  1131 +
  1132 +void main() {
  1133 + test('''
  1134 +Test the state of the reactive variable "name" across all of its lifecycles''',
  1135 + () {
  1136 + /// Controller'ınızı lifecycle dışında test edebilirsiniz.
  1137 + /// Fakat bunu GetX dependency injection kullanmadığınız taktirde
  1138 + /// kullanmanız önerilmiyor.
  1139 + final controller = Controller();
  1140 + expect(controller.name.value, 'name1');
  1141 +
  1142 + /// Eğer kullanıyorsanı istediğiniz her şeyi test edebilirsiniz.
  1143 + /// Her lifecycle sonrası uygulamanızın durumu dahil olmak üzere.
  1144 + Get.put(controller); // onInit çağrıldıktan sonra
  1145 + expect(controller.name.value, 'name2');
  1146 +
  1147 + /// Bu fonksoynu test edin
  1148 + controller.changeName();
  1149 + expect(controller.name.value, 'name3');
  1150 +
  1151 + /// onClose çağrıldıktan sonra
  1152 + Get.delete<Controller>();
  1153 +
  1154 + expect(controller.name.value, '');
  1155 + });
  1156 +}
  1157 +```
  1158 +
  1159 +#### Tips
  1160 +
  1161 +##### Mockito or mocktail
  1162 +Eğer GetxController/GetxService'inizi mock yapmaya ihtiyacınız varsa GetxController'dan extend etmeniz ve Mock ile mixin'lemelisiniz.
  1163 +
  1164 +```dart
  1165 +class NotificationServiceMock extends GetxService with Mock implements NotificationService {}
  1166 +```
  1167 +
  1168 +##### Using Get.reset()
  1169 +Eğer widget'ları ya da widget grupllarını test etmek istiyorsanız, testinizin sonunda Get.reset'i kullanın ya da önceki testinizden kalma tüm ayarları sıfırlayın.
  1170 +
  1171 +##### Get.testMode
  1172 +Eğer controller'larınızın içinden navigation kullanmak istiyorsanız. Main'den önce `Get.testMode = true` şeklinde kullanın.
  1173 +
  1174 +
  1175 +# 2.0 İle Gelen Büyük Değişiklikler
  1176 +
  1177 +1- Rx Types :
  1178 +
  1179 +| Önce | Sonra |
  1180 +| ------- | ---------- |
  1181 +| StringX | `RxString` |
  1182 +| IntX | `RxInt` |
  1183 +| MapX | `RxMap` |
  1184 +| ListX | `RxList` |
  1185 +| NumX | `RxNum` |
  1186 +| DoubleX | `RxDouble` |
  1187 +
  1188 +RxController ve GetBuilder şimdi birleştiler. Artık hangi controller'ı kullanmak istediğinizi hatırlamak zorunda değilsiniz. SAdece GetxController diyerek halledin. Bu simple state management ve reactive ile düzgün çalışacaktır.
  1189 +
  1190 +2- NamedRoutes
  1191 +
  1192 +Önce:
  1193 +
  1194 +```dart
  1195 +GetMaterialApp(
  1196 + namedRoutes: {
  1197 + '/': GetRoute(page: Home()),
  1198 + }
  1199 +)
  1200 +```
  1201 +
  1202 +Şimdiki:
  1203 +
  1204 +```dart
  1205 +GetMaterialApp(
  1206 + getPages: [
  1207 + GetPage(name: '/', page: () => Home()),
  1208 + ]
  1209 +)
  1210 +```
  1211 +Neden bu değişiklik?
  1212 +
  1213 +Genellikle, hangi sayfanın bir parametreden görüntüleneceğine veya bir giriş belirteciden görüntüleneceğine karar vermek gerekebilir, önceki yaklaşım buna izin vermediği için esnek değildi.
  1214 +Sayfayı bir fonksiyona sokmak, RAM tüketimini önemli ölçüde azaltır, çünkü rotalar uygulama başlatılmasından bu yana belleğe tahsis edilmeyecek ve aynı zamanda bu tür bir yaklaşım yapmasına izin verilmeyecek:
  1215 +
  1216 +```dart
  1217 +
  1218 +GetStorage box = GetStorage();
  1219 +
  1220 +GetMaterialApp(
  1221 + getPages: [
  1222 + GetPage(name: '/', page:(){
  1223 + return box.hasData('token') ? Home() : Login();
  1224 + })
  1225 + ]
  1226 +)
  1227 +```
  1228 +
  1229 +# Neden Getx?
  1230 +
  1231 +1- Birçok kez Flutter güncellendikten sonra, birçok paket çalışmaz hale gelecek. Genelde derleme hataları gerçekleşir. Bu hataların hala cevabı olmayabilir. Geliştiricinin bu hatanın nerden geldiğini bilmesi gereklidir. Sonrasında bu hatayı izleyip bunun hakkında repository'de issue açması ve sorunun çözülmesini beklemelidir. Get, geliştirme için gereken ana kaynaklarını (State, dependency ve route management) merkezde toplar, pubspec'e tek bir paket eklemeye izin verir ve çalışmaya başlar. Flutter güncellendikten sonra tek yapmanız gereken Get dependency'yi güncellemek ve çalışmaya başlamaktır. Get uyumluluk problemlerini de çözer. Paketler arasında genelde güncellemeler sonrası uyumsuzluklar olabilir. Get'in kendi içinde her şey birbiri ile uyumlu olduğundan bunun için endişelenmenize gerek yoktur.
  1232 +
  1233 +2- Flutter oldukça kolay kullanımı olan inanılmaz olmasının yanı sıra birçok geliştirici tarafından istenmeyen `Navigator.of(context).push (context, builder [...]` gibi ezber yapılar içerir. Get geliştirmeyi basitleştirir. Route çağırmak için 8 kod yazmak yerine sadece `Get.to(Home())` diyerek bir sonraki sayfaya geçebilirsin. Dynamic web urls ile çalışmak mevcut Flutter ile çalışırken zorlayıcı olabilir. Get ile durum tam tersi hal alır ve işleri çok kolay bir hale getirir. Flutter'da State'leri yönetmek için dependency'leri pub içerindeki yüzlerce kütüphane arasından seçmek birçok tartışmayı da beraberinde getiren bir konudur. Get sayesinde ekranda değişkeni otomatik olarak güncellemesini sağlamak için değişkeninizin sonuna ".obs" eklemek ve widget'ınızı Obx ile sarmalamak yeterlidir.
  1234 +
  1235 +3- Performansı kafaya takmayın. Flutter'ın performansı zaten çok iyi. Bir de state manager kullanırken ve blocs/stores/controllers gibi sınıflarınızı locator ile yönetirken de aynı performansı aldığınızı düşünün. İhtiyacınız olmadığında dependency'lerinizi dışarıdan çağırmak zorunda kalacaksınız. Hiç düşündünüz mü, basitçe kullandığınız controller'ınızın artık kimse tarafından kullanılmadığında kolayca bellekten silindiğini? İşte GetX bunu yapar. SmartManagement sayesinde kullanılmayan her şey endişelenmenize gerek kalmadan otomatik olarak hafızadan silinir. Bunun için bir logic yaratmaya gerek bile kalmadan, kaynakları minimum ölçüde tükettiğinize emin olabilirsiniz.
  1236 +
  1237 +4- Gerçek ayrıştırma: "View ile the business logic (iş mantığını) birbirlerinden ayırmak" kavramını duymuş olabilirsiniz. Bu sadece BLoC, MVC, MVVM'ye özgü bir özellik değildir, piyasadaki diğer standart tasarım desenlerinde de mevcuttur. Ancak bu kavram Flutter'da context kullanımına bağlı olarak kolaylaştırılabilir.
  1238 +Bir InheritedWidget bulabilmek için context'e ihtiyaç duyduğunuzda, bunu view'da yapmalı ya da parametre ile aktarmalıyız. Ben bu yöntemi oldukça çirkin buluyorum. Ayrıca bir ekip ile çalışırken View'daki iş mantığına hep bağımlı olacağız. GetX standart yaklaşımı benimsemez ve StatefulWidgets, InitState, vb. yapılarını tamamen ortadan kaldırmaz. Daha temiz bir yaklaşım sunar. Controller'ların yaşam döngüleri vardır. Mesela APIREST talebi yaptığında view'a bağlı olmak zorunda değilsin. Http çağrısı başlatmak için "onInit" kullanabilirsiniz. Veriler geldiğinde yerleştirilecektir. GEtX tamamen reaktif (cidden,stream'lerin altında çalışır) olduğu için tüm item'lar doldurulduğunda o değişkeni kullanan tüm widget'lar view'da otomatik olarak güncellenecektir. Bu UI uzmanlığına sahip kişilerin sadece widget'larla çalışmasını sağlar ve kullanıcı etkinlikleri dışında iş mantığına hiçbir şey göndermek zorunda değildir (bir düğmeye tıklamak gibi). İş mantığı ile çalışan insanlar, bunu ayrı olarak oluşturmak ve test etmek konusunda serbest olacaktır.
  1239 +
  1240 +Bu kütüphane her zaman güncellenebilir ve yeni özellikler eklenebilir olacaktır. PR ve contribute yapmakta tamamen özgürsünüz.
  1241 +
  1242 +# Topluluk
  1243 +
  1244 +## Topluluk Kanalları
  1245 +
  1246 +GetX oldukça aktif ve yardımsever bir topluluğa sahiptir. Bu framework kullanımıyla ilgili sorularınız varsa veya herhangi bir yardım istiyorsanız, lütfen topluluk kanallarımıza katılın, sorunuz daha hızlı yanıtlanacak ki bunun için en uygun yer burasıdır. Repository'de issues açabilir ve kaynak talep edebilirsiniz. GetX topluluğunun bir parçası olmaktan çekinmeyin.
  1247 +
  1248 +| **Slack** | **Discord** | **Telegram** |
  1249 +| :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------- |
  1250 +| [![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) | [![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) | [![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) |
  1251 +
  1252 +## Nasıl katkıda bulunulur?
  1253 +
  1254 +_Projeye katkıda bulunmak ister misiniz? Sizi destekçilerimizden biri olarak öne çıkarmaktan gurur duyacağız. İşte katkıda bulunabileceğiniz ve Get'i (ve Flutter'ı) daha da iyi hale getirebileceğiniz bazı noktalar._
  1255 +
  1256 +- Readme dosyasının diğer dillere çevrilmesine yardımcı olmak.
  1257 +- Readme'ye dokümanlar eklemek (birçok Get fonsyonu henüz belgelenmedi).
  1258 +- Get'in kullanımını öğretmek için makaleler yazabilir ya da videolar çekebilirsiniz (Bunlar Readme ve gelecekte Wiki'ye eklenecek).
  1259 +- Kod ve test PR'ları önermek.
  1260 +- Yeni fonksiyonlar eklemek.
  1261 +
  1262 +Her türlü yardım için teşekkürler.
  1263 +
  1264 +
  1265 +## Makaleler ve videolar
  1266 +
  1267 +- [Flutter Getx EcoSystem package for arabic people](https://www.youtube.com/playlist?list=PLV1fXIAyjeuZ6M8m56zajMUwu4uE3-SL0) - Tutorial by [Pesa Coder](https://github.com/UsamaElgendy).
  1268 +- [Dynamic Themes in 3 lines using GetX™](https://medium.com/swlh/flutter-dynamic-themes-in-3-lines-c3b375f292e3) - Tutorial by [Rod Brown](https://github.com/RodBr).
  1269 +- [Complete GetX™ Navigation](https://www.youtube.com/watch?v=RaqPIoJSTtI) - Route management video by Amateur Coder.
  1270 +- [Complete GetX State Management](https://www.youtube.com/watch?v=CNpXbeI_slw) - State management video by Amateur Coder.
  1271 +- [GetX™ Other Features](https://youtu.be/ttQtlX_Q0eU) - Utils, storage, bindings and other features video by Amateur Coder.
  1272 +- [Firestore User with GetX | Todo App](https://www.youtube.com/watch?v=BiV0DcXgk58) - Video by Amateur Coder.
  1273 +- [Firebase Auth with GetX | Todo App](https://www.youtube.com/watch?v=-H-T_BSgfOE) - Video by Amateur Coder.
  1274 +- [The Flutter GetX™ Ecosystem ~ State Management](https://medium.com/flutter-community/the-flutter-getx-ecosystem-state-management-881c7235511d) - State management by [Aachman Garg](https://github.com/imaachman).
  1275 +- [The Flutter GetX™ Ecosystem ~ Dependency Injection](https://medium.com/flutter-community/the-flutter-getx-ecosystem-dependency-injection-8e763d0ec6b9) - Dependency Injection by [Aachman Garg](https://github.com/imaachman).
  1276 +- [GetX, the all-in-one Flutter package](https://www.youtube.com/watch?v=IYQgtu9TM74) - A brief tutorial covering State Management and Navigation by Thad Carnevalli.
  1277 +- [Build a To-do List App from scratch using Flutter and GetX](https://www.youtube.com/watch?v=EcnqFasHf18) - UI + State Management + Storage video by Thad Carnevalli.
  1278 +- [GetX Flutter Firebase Auth Example](https://medium.com/@jeffmcmorris/getx-flutter-firebase-auth-example-b383c1dd1de2) - Article by Jeff McMorris.
  1279 +- [Flutter State Management with GetX – Complete App](https://www.appwithflutter.com/flutter-state-management-with-getx/) - by App With Flutter.
  1280 +- [Flutter Routing with Animation using Get Package](https://www.appwithflutter.com/flutter-routing-using-get-package/) - by App With Flutter.
  1281 +- [A minimal example on dartpad](https://dartpad.dev/2b3d0d6f9d4e312c5fdbefc414c1727e?) - by [Roi Peker](https://github.com/roipeker)