Natesh Bhat
Committed by GitHub

Merge branch 'master' into master

Too many changes to show.

To preserve performance only 26 of 26+ files are displayed.

No preview for this file type
@@ -23,7 +23,7 @@ jobs: @@ -23,7 +23,7 @@ jobs:
23 # https://github.com/marketplace/actions/flutter-action 23 # https://github.com/marketplace/actions/flutter-action
24 - uses: subosito/flutter-action@v1 24 - uses: subosito/flutter-action@v1
25 with: 25 with:
26 - flutter-version: "1.22.3" 26 + flutter-version: "2.0.2"
27 channel: "stable" 27 channel: "stable"
28 - run: flutter pub get 28 - run: flutter pub get
29 #- run: flutter analyze 29 #- run: flutter analyze
  1 +# This file tracks properties of this Flutter project.
  2 +# Used by Flutter tool to assess capabilities and perform upgrades etc.
  3 +#
  4 +# This file should be version controlled and should not be manually edited.
  5 +
  6 +version:
  7 + revision: 60bd88df915880d23877bfc1602e8ddcf4c4dd2a
  8 + channel: stable
  9 +
  10 +project_type: app
1 -## [3.25.0] 1 +## [4.1.4]
  2 +- Adjust operator + and - to RxInt (@eduardoflorence)
  3 +- Fix dark theme (@eduardoflorence)
  4 +- Fix form-urlencoded on GetConnect (@aramayyes)
  5 +
  6 +
  7 +## [4.1.3]
  8 +- Fix "Error: A value of type 'Locale?' can't be returned from a function"on flutter web (@nickwri)
  9 +- Fix plural translations to expressions >1 (@WolfVic)
  10 +
  11 +## [4.1.2]
  12 +- Fix warning ˜can add data to a closed stream˜ when GetBuilder and Obx are nested
  13 +- Fix get_connect decoder can not be null (@Goddchen)
  14 +- Migrate example code (@3lB4rt0)
  15 +- Fix initial value of nullables (@RafaRuiz)
  16 +- Improve error message to navigation (@maxzod)
  17 +- Fix typo on docs (@Rahulshahare)
  18 +- Fixed darktheme being changed only through Get.changeTheme and not through the DarkTheme theme property in MaterialApp (@GoldenSoju)
  19 +- Fix controller is removed when navigate to same page (@eduardoflorence)
  20 +- Fix missing reload() and reloadAll() to Get extensions (@lkloon123)
  21 +
  22 +
  23 +## [4.1.1]
  24 +- Remove mandatory initialValue to nullables types
  25 +
  26 +## [4.1.0]
  27 +- Added Rxn to non nullables reactives types
  28 +
  29 +## [4.0.3]
  30 +- Added new linter rules to improve score
  31 +
  32 +## [4.0.2]
  33 +- Removed "!" of if else conditions until the null-safety of the dart is consistent for using it.
  34 +
  35 +## [4.0.1]
  36 +- Fix changelog
  37 +
  38 +## [4.0.0]
  39 +- Added append function to StateMixin. Now is possible track loading, success and error handle of your application with ONE LINE OF CODE. Ex: append(()=> api.getUser);
  40 +- Migrate to null-safety
  41 +- Added ScrollMixin to controllers
  42 +- Added loadingMore status to RxStatus
  43 +- Fix content-type qual null (@katekko)
  44 +- Made GetInstance non nullable (@eduardoflorence)
  45 +- Fix multi-parameters url (@iMrLopez)
  46 +- Fix Expected value of SkDeletable error (@obadajasm)
  47 +- Added triggers, an Rx method that triggers events, even if they are the same as the previous event (@RafaRuiz)
  48 +- Improve docs: (@CNAD666), (@dhhAndroid), (@Jackylee1992),
  49 +
  50 +Switching to null-safety:
  51 +You can continue using GetX as normal, with as little breaking changes as possible.
  52 +It is still possible to declare the var.obs variable, and this remains the preferred way, forcing null-safety and giving you all the security that sound null-safety delivers to your app. However, if you need to use null, we also provide a solution for you.
  53 +Declare the variables with `?` Ex: `final Rx<int?> count = 0.obs`.
  54 +You can also use custom Rxn types with null-safety:
  55 +`RxInt` == not nullable
  56 +`RxnInt` == nullable.
  57 +
  58 +## [3.25.6]
  59 +- Added documentation in French (@kamazoun)
  60 +- Fix logs messages (@damphat)
  61 +- Fix plural to zero on internacionalization (@RafaRuiz)
  62 +- Fix error when body hasn't content on GetConnect (@jasonlaw)
  63 +- Fix typos on readme (@bashleigh)
  64 +- Fix group updates to GetBuilder
  65 +
  66 +## [3.25.5]
  67 +- Fix Get.isDialogOpen when two or more open dialogs are closed
  68 +
  69 +## [3.25.4]
  70 +- Added logs and tests to unknownRoute
  71 +
  72 +## [3.25.3]
  73 +- Fix bindStream error 'Object.noSuchMethod'.
  74 +
  75 +## [3.25.2]
  76 +- Improved Workers system to accept a list of works
  77 +
  78 +## [3.25.1]
  79 +- Improved the log system to display the tag used in the controller that was created.
  80 +
  81 +## [3.25.0] - Big update
  82 +- Added [reload] and [reloadAll] methods to reload your Controller to original values
  83 +- Added [FullLifeCycleController] - A GetxController capable of observing all the life cycles of your application. FullLifeCycleController has the life cycles:
  84 + * onInit: called when the controller enters the application's memory
  85 + * onReady: called after onInit, when build method from widget relationed to controller is done.
  86 + * onClose: called when controller is deleted from memory.
  87 + * onPaused: called when the application is not currently visible to the user, and running in the background.
  88 + * onInactive: called when the application is in an inactive state and is not receiving user input, when the user receives a call, for example
  89 + * onResumed: The application is now visible and in the foreground
  90 + * onDetached: The application is still hosted on a flutter engine but is detached from any host views.
  91 + * didChangeMetrics: called when the window size is changed
  92 +- Added SuperController, a complete life circle controller with StateMixin
  93 +- Improve Iterable Rx Api. Now, you can to use dart List, Map and Set as reactive, like: List<String> names = <String>['juan', 'pedro', 'maria'].obs;
  94 +- Added assign and assignAll extensions to default dart List
  95 +- Added parameters options from Get.toNamed, Get.offNamed, and Get.offAllNamed (@enghitalo)
  96 +- Improve Rx disposal logic to completely prevent memory leaks
  97 +- Improve Capitalize methods from GetUtils (@eduardoflorence)
  98 +- Prevent a close snackbar from close a Screen with double tap (@eduardoflorence)
  99 +- Includes GetLifeCycleBase mixin on delete/dispose (@saviogrossi)
  100 +- Added internacionalization example to sample app (@rodriguesJeff)
  101 +- Added headers to Graphql query and mutation(@asalvi0)
  102 +- Added translation with parameter extension (@CpdnCristiano)
  103 +- Added Get.parameter access to Middleware (@eduardoflorence)
  104 +- Fix RxBool typo (@emanuelmutschlechner)
  105 +- Added Filter to GetBuilder
  106 +- Added debouce to GetBuilder update
  107 +- Added ability to insert an Enum, class, or type of an object as a GetBuilder's Id
  108 +- Improve upload time from GetConnect
  109 +- Create minified version to DartPad(@roipeker)
  110 +- Suggested to use `Get.to(() => Page())` instead of `Get.to(Page())`.
  111 +- Added more status codes to GetConnect (@romavic)
  112 +- Fix and improve docs: @unacorbatanegra, @lsm, @nivisi, @ThinkDigitalSoftware, @martwozniak, @UsamaElgendy, @@DominusKelvin, @jintak0401, @goondeal
  113 +
2 114
3 ## [3.24.0] 115 ## [3.24.0]
4 - GetWidget has been completely redesigned. 116 - GetWidget has been completely redesigned.
1 ![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) 1 ![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png)
2 2
3 -*Idiomas: Español (este archivo), [Indonesio](README.id-ID.md), [Urdu](README.ur-PK.md), [Lengua china](README.zh-cn.md), [Inglés](README.md), [Portugués de Brasil](README.pt-br.md), [Ruso](README.ru.md), [Polaco](README.pl.md), [Coreano](README.ko-kr.md).* 3 +*Idiomas: Español (este archivo), [Indonesio](README.id-ID.md), [Urdu](README.ur-PK.md), [Lengua china](README.zh-cn.md), [Inglés](README.md), [Portugués de Brasil](README.pt-br.md), [Ruso](README.ru.md), [Polaco](README.pl.md), [Coreano](README.ko-kr.md), [Francés](README-fr.md).*
4 4
5 [![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get) 5 [![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get)
6 ![building](https://github.com/jonataslaw/get/workflows/build/badge.svg) 6 ![building](https://github.com/jonataslaw/get/workflows/build/badge.svg)
@@ -136,7 +136,7 @@ class Home extends StatelessWidget { @@ -136,7 +136,7 @@ class Home extends StatelessWidget {
136 appBar: AppBar(title: Obx(() => Text("Clicks: " + c.count.string))), 136 appBar: AppBar(title: Obx(() => Text("Clicks: " + c.count.string))),
137 137
138 // Reemplace el Navigator.push de 8 líneas por un simple Get.to(). No necesitas contexto 138 // Reemplace el Navigator.push de 8 líneas por un simple Get.to(). No necesitas contexto
139 - body: Center(child: RaisedButton( 139 + body: Center(child: ElevatedButton(
140 child: Text("Go to Other"), onPressed: () => Get.to(Other()))), 140 child: Text("Go to Other"), onPressed: () => Get.to(Other()))),
141 floatingActionButton: 141 floatingActionButton:
142 FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment)); 142 FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment));
  1 +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png)
  2 +
  3 +**Langues: Français (Ce fichier), [Anglais](README.md), [Indonésien](README.id-ID.md), [Urdu](README.ur-PK.md), [Chinois](README.zh-cn.md), [Portuguais du Brésil](README.pt-br.md), [Espagnol](README-es.md), [Russe](README.ru.md), [Polonais](README.pl.md), [Koréen](README.ko-kr.md).**
  4 +
  5 +[![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get)
  6 +[![likes](https://badges.bar/get/likes)](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="Achetez moi un cafe" 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 +- [A Propos de Get](#a-propos-de-get)
  20 +- [Installation](#installation)
  21 +- [L'application 'Counter' avec GetX](#application-counter-avec-getx)
  22 +- [Les trois pilliers](#les-trois-pilliers)
  23 + - [Gestion d'état (State management)](#gestion-d-etat)
  24 + - [Gestionnaire d'état réactif (Reactive State Manager)](#gestionnaire-d-etat-reactif)
  25 + - [Plus de détails sur la gestion d'état](#plus-de-details-sur-la-gestion-d-etat)
  26 + - [Gestion de route](#gestion-de-route)
  27 + - [Plus de détails sur la gestion de route](#plus-de-details-sur-la-gestion-de-route)
  28 + - [Gestion des dépendances](#gestion-des-dependances)
  29 + - [Plus de détails sur la gestion des dépendances](#plus-de-details-sur-la-gestion-des-dependances)
  30 +- [Utils](#utils)
  31 + - [Internationalization](#internationalization)
  32 + - [Traductions](#traductions)
  33 + - [Utiliser les traductions](#utiliser-les-traductions)
  34 + - [Locales](#locales)
  35 + - [Changer la locale](#changer-la-locale)
  36 + - [Locale du Système](#locale-du-systeme)
  37 + - [Changer le Thème](#changer-le-theme)
  38 + - [GetConnect](#getconnect)
  39 + - [Configuration par défaut](#configuration-par-defaut)
  40 + - [Configuration personnalisée](#configuration-personnalisee)
  41 + - [Middleware GetPage](#middleware-getpage)
  42 + - [Priority](#priority)
  43 + - [Redirect](#redirect)
  44 + - [onPageCalled](#onpagecalled)
  45 + - [OnBindingsStart](#onbindingsstart)
  46 + - [OnPageBuildStart](#onpagebuildstart)
  47 + - [OnPageBuilt](#onpagebuilt)
  48 + - [OnPageDispose](#onpagedispose)
  49 + - [Autres APIs](#autres-apis)
  50 + - [Paramètres globaux et configurations manuelles facultatifs](#parametres-globaux-et-configurations-manuelles-facultatifs)
  51 + - [State Widgets Locaux](#state-widgets-locaux)
  52 + - [ValueBuilder](#valuebuilder)
  53 + - [ObxValue](#obxvalue)
  54 + - [Conseils utiles](#conseils-utiles)
  55 + - [GetView](#getview)
  56 + - [GetResponsiveView](#getresponsiveview)
  57 + - [Guide d'utilisation](#guide-d-utilisation)
  58 + - [GetWidget](#getwidget)
  59 + - [GetxService](#getxservice)
  60 +- [Changements par rapport à 2.0](#changements-par-rapport-a-20)
  61 +- [Pourquoi Getx?](#pourquoi-getx)
  62 +- [Communité](#communite)
  63 + - [Chaînes communautaires](#chaines-communautaires)
  64 + - [Comment contribuer](#comment-contribuer)
  65 + - [Articles et videos](#articles-et-videos)
  66 +
  67 +# A Propos de Get
  68 +
  69 +- GetX est une solution extra-légère et puissante pour Flutter. Il combine une gestion d'état (state management) de haute performance, une injection de dépendances (dependency injection) intelligente et une gestion de route (route management) rapide et pratique.
  70 +
  71 +- GetX a 3 principes de base. Cela signifie que ces principes sont les priorités pour toutes les ressources de la bibliothèque GetX: **PRODUCTIVITÉ, PERFORMANCE ET ORGANIZATION.**
  72 +
  73 + - **PERFORMANCE:** GetX se concentre sur la performance et la consommation minimale de ressources. GetX n'utilise ni Streams ni ChangeNotifier.
  74 +
  75 + - **PRODUCTIVITÉ:** GetX utilise une syntaxe simple et agréable. Peu importe ce que vous voulez faire, il existe toujours un moyen plus simple avec GetX. Cela économisera des heures de développement et fournira les performances maximales que votre application peut offrir.
  76 +
  77 + En règle générale, le développeur doit s'occuper lui-même de la suppression des contrôleurs de la mémoire. Avec GetX, cela n'est pas nécessaire car les ressources sont, par défaut, supprimées de la mémoire lorsqu'elles ne sont pas utilisées. Si vous souhaitez les conserver en mémoire, vous devez déclarer explicitement "permanent: true" comme paramètre lors de la création de la ressource. De cette façon, en plus de gagner du temps, vous risquez moins d'avoir des ressources inutiles dans la mémoire. L'initialisation des ressources est également 'lazy' par défaut (i.e. se fait seulement lorsque la ressource est nécessaire).
  78 +
  79 + - **ORGANIZATION:** GetX permet le découplage total de la Vue (View), de la Logique de Présentation (Presentation Logic), de la Business Logic, de l'injection de dépendances (Dependency Injection) et de la Navigation. Vous n'avez pas besoin de contexte pour naviguer entre les routes, vous n'êtes donc pas dépendant de la hiérarchisation des widgets (visualisation) pour cela. Vous n'avez pas besoin de 'context' pour accéder à vos contrôleurs/blocs via un inheritedWidget, vous dissociez donc complètement votre logique de présentation (Vue) et votre Business logic de votre couche de visualisation. Vous n'avez pas besoin d'injecter vos classes Controlleûrs / Modèles / Blocs le long de la hiérarchie de Widgets via `MultiProvider`. Pour cela, GetX utilise sa propre fonction d'injection de dépendances (DI), découplant complètement la DI de sa Vue.
  80 +
  81 + Avec GetX, vous savez où trouver chaque module de votre application, avec un code propre par défaut. En plus de rendre la maintenance facile, cela rend le partage de modules quelque chose qui jusque-là dans Flutter était impensable, quelque chose de totalement possible.
  82 + BLoC était un point de départ pour organiser le code dans Flutter, il sépare la Business logic de la visualisation. GetX en est une évolution naturelle, séparant non seulement la Business logic mais aussi la logique de présentation. L'injection de dépendances et les routes sont également découplées, et la couche de données est séparée du tout. Vous savez où tout se trouve, et tout cela d'une manière plus facile que de construire un 'Hello World''.
  83 + GetX est le moyen le plus simple, pratique et évolutif de créer des applications hautes performances avec le SDK Flutter. Il possède un vaste écosystème qui fonctionne parfaitement, c'est facile pour les débutants et précis pour les experts. Il est sécurisé, stable, à jour et offre une vaste gamme d'API intégrées qui ne sont pas présentes dans le SDK Flutter par défaut.
  84 +
  85 +- GetX possède une multitude de fonctionnalités qui vous permettent de démarrer la programmation sans vous soucier de quoi que ce soit, mais chacune de ces fonctionnalités se trouve dans des conteneurs séparés et ne démarre qu'après utilisation. Si vous n'utilisez que la gestion des états (State Management), seule la gestion des états sera compilée. Si vous n'utilisez que des routes, rien de la gestion d'état ne sera compilé.
  86 +
  87 +- GetX a un énorme écosystème, une grande communauté, un grand nombre de collaborateurs, et sera maintenu tant que Flutter existera. GetX est également capable de fonctionner avec le même code sur Android, iOS, Web, Mac, Linux, Windows et sur votre serveur. Il est possible de réutiliser entièrement votre code créé sur le frontend et le backend avec Get Server.
  88 + **Il est possible d'entièrement réutiliser votre code écrit sur le frontend, pour le backend avec [Get Server](https://github.com/jonataslaw/get_server)**.
  89 +
  90 +**De plus, l'ensemble du processus de développement peut être complètement automatisé, à la fois sur le serveur et sur le front-end avec [Get CLI](https://github.com/jonataslaw/get_cli)**.
  91 +
  92 +**De plus, pour augmenter encore votre productivité, nous avons l'[extension pour VSCode](https://marketplace.visualstudio.com/items?itemName=get-snippets.get-snippets) et l'[extension pour Android Studio/Intellij](https://plugins.jetbrains.com/plugin/14975-getx-snippets)**
  93 +
  94 +# Installation
  95 +
  96 +Ajoutez Get à votre fichier pubspec.yaml:
  97 +
  98 +```yaml
  99 +dependencies:
  100 + get:
  101 +```
  102 +
  103 +Importez Get dans les fichiers dans lesquels il doit être utilisé:
  104 +
  105 +```dart
  106 +import 'package:get/get.dart';
  107 +```
  108 +
  109 +# Application Counter avec Getx
  110 +
  111 +Le projet "Counter" créé par défaut sur chaque nouveau projet Flutter comporte plus de 100 lignes (avec commentaires). Pour montrer la puissance de Get, je vais vous montrer comment faire un "compteur" changeant d'état à chaque clic, naviguer entre les pages et partager l'état entre les écrans, le tout de manière organisée, en séparant la Business logic de la Vue, en SEULEMENT 26 LIGNES DE CODE INCLUANT LES COMMENTAIRES.
  112 +- Step 1:
  113 + Ajoutez "Get" avant MaterialApp, pour le transformer en GetMaterialApp
  114 +
  115 +```dart
  116 +void main() => runApp(GetMaterialApp(home: Home()));
  117 +```
  118 +
  119 +- Note: cela ne modifie pas le MaterialApp de Flutter, GetMaterialApp n'est pas un MaterialApp modifié, il s'agit simplement d'un widget préconfiguré, qui a le MaterialApp par défaut comme enfant (child: ). Vous pouvez le configurer manuellement, mais ce n'est certainement pas nécessaire. GetMaterialApp créera des routes, les injectera, injectera les traductions, injectera tout ce dont vous avez besoin pour la navigation de routes. Si vous utilisez Get uniquement pour la gestion de l'état (State management) ou la gestion des dépendances (DI), il n'est pas nécessaire d'utiliser GetMaterialApp. GetMaterialApp est nécessaire pour les routes, les 'snackbars', l'internationalisation, les 'bottomSheets', les dialogues et les API de haut niveau liés aux routes et à l'absence de 'context'.
  120 +
  121 +- Note²: Cette étape n'est nécessaire que si vous allez utiliser la gestion de routes (Get.to(), Get.back(), etc). Si vous ne l'utiliserez pas, il n'est pas nécessaire de faire l'étape 1.
  122 +
  123 +- Step 2:
  124 + Créez votre classe de Business logic et placez-y toutes les variables, méthodes et contrôleurs.
  125 + Vous pouvez rendre toute variable observable en utilisant un simple ".obs".
  126 +
  127 +```dart
  128 +class Controller extends GetxController{
  129 + var count = 0.obs;
  130 + increment() => count++;
  131 +}
  132 +```
  133 +
  134 +- Step 3:
  135 + Créez votre Vue, utilisez StatelessWidget et économisez de la RAM, avec Get, vous n'aurez peut-être plus besoin d'utiliser StatefulWidget.
  136 +
  137 +```dart
  138 +class Home extends StatelessWidget {
  139 +
  140 + @override
  141 + Widget build(context) {
  142 +
  143 + // Instanciez votre classe en utilisant Get.put() pour le rendre disponible pour tous les routes "descendantes".
  144 + final Controller c = Get.put(Controller());
  145 +
  146 + return Scaffold(
  147 + // Utilisez Obx(()=> pour mettre à jour Text() chaque fois que count est changé.
  148 + appBar: AppBar(title: Obx(() => Text("Clicks: ${c.count}"))),
  149 +
  150 + // Remplacez les 8 lignes Navigator.push par un simple Get.to(). Vous n'avez pas besoin de 'context'
  151 + body: Center(child: ElevatedButton(
  152 + child: Text("Go to Other"), onPressed: () => Get.to(Other()))),
  153 + floatingActionButton:
  154 + FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment));
  155 + }
  156 +}
  157 +
  158 +class Other extends StatelessWidget {
  159 + // Vous pouvez demander à Get de trouver un contrôleur utilisé par une autre page et de vous y rediriger.
  160 + final Controller c = Get.find();
  161 +
  162 + @override
  163 + Widget build(context){
  164 + // Accéder à la variable 'count' qui est mise à jour
  165 + return Scaffold(body: Center(child: Text("${c.count}")));
  166 + }
  167 +}
  168 +```
  169 +
  170 +Résultat:
  171 +
  172 +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/counter-app-gif.gif)
  173 +
  174 +C'est un projet simple mais il montre déjà à quel point Get est puissant. Au fur et à mesure que votre projet se développe, cette différence deviendra plus significative.
  175 +
  176 +Get a été conçu pour fonctionner avec des équipes, mais il simplifie le travail d'un développeur individuel.
  177 +
  178 +Améliorez vos délais, livrez tout à temps sans perte de performances. Get n'est pas pour tout le monde, mais si vous vous êtes identifié à cette phrase, Get est fait pour vous!
  179 +
  180 +# Les trois pilliers
  181 +
  182 +## Gestion d Etat
  183 +
  184 +Get a deux gestionnaires d'état différents: le gestionnaire d'état simple (nous l'appellerons GetBuilder) et le gestionnaire d'état réactif (GetX / Obx).
  185 +
  186 +### Gestionnaire d Etat Reactif
  187 +
  188 +La programmation réactive peut aliéner de nombreuses personnes car on dit qu'elle est compliquée. GetX fait de la programmation réactive quelque chose d'assez simple:
  189 +
  190 +- Vous n'aurez pas besoin de créer des StreamControllers.
  191 +- Vous n'aurez pas besoin de créer un StreamBuilder pour chaque variable
  192 +- Vous n'aurez pas besoin de créer une classe pour chaque état.
  193 +- Vous n'aurez pas besoin de créer un 'get' pour une valeur initiale.
  194 +- Vous n'aurez pas besoin d'utiliser des générateurs de code
  195 +
  196 +La programmation réactive avec Get est aussi simple que d'utiliser setState.
  197 +
  198 +Imaginons que vous ayez une variable 'name' et que vous souhaitiez que chaque fois que vous la modifiez, tous les widgets qui l'utilisent soient automatiquement modifiés.
  199 +
  200 +Voici votre variable:
  201 +
  202 +```dart
  203 +var name = 'Jonatas Borges';
  204 +```
  205 +
  206 +Pour la rendre observable, il vous suffit d'ajouter ".obs" à la fin:
  207 +
  208 +```dart
  209 +var name = 'Jonatas Borges'.obs;
  210 +```
  211 +
  212 +Et dans l'interface utilisateur, lorsque vous souhaitez afficher cette valeur et mettre à jour l'écran chaque fois qu'elle change, faites simplement:
  213 +
  214 +```dart
  215 +Obx(() => Text("${controller.name}"));
  216 +```
  217 +
  218 +C'est _tout_. Si simple que ca.
  219 +
  220 +### Plus de details sur la gestion d Etat
  221 +
  222 +**Lire une explication plus approfondie de la gestion d'état [ici](./documentation/fr_FR/state_management.md). Là-bas, vous verrez plus d'exemples surtout pour la différence entre le gestionnaire d'état simple et le gestionnaire d'état réactif.**
  223 +
  224 +Vous pourrez vous faire une meilleure idée de la puissance de GetX.
  225 +
  226 +## Gestion de route
  227 +
  228 +Si vous envisagez d'utiliser des routes/snackbars/dialogs/bottomsheets sans 'context', GetX est également excellent pour vous, voyez par vous-même:
  229 +
  230 +Ajoutez "Get" avant votre MaterialApp, en le transformant en GetMaterialApp
  231 +
  232 +```dart
  233 +GetMaterialApp( // Avant: MaterialApp(
  234 + home: MyHome(),
  235 +)
  236 +```
  237 +
  238 +Accédez à un nouvel écran:
  239 +
  240 +```dart
  241 +
  242 +Get.to(ÉcranSuivant());
  243 +```
  244 +
  245 +Accédez au nouvel écran par le nom. Voir plus de détails sur les itinéraires nommés (named routes) [ici](./documentation/fr_FR/route_management.md#navigation-avec-des-itinraires-nomms)
  246 +
  247 +```dart
  248 +
  249 +Get.toNamed('/details');
  250 +```
  251 +
  252 +Pour fermer des snackbars, dialogs, bottomsheets, ou tout ce que vous auriez normalement fermé avec Navigator.pop(context);
  253 +
  254 +```dart
  255 +Get.back();
  256 +```
  257 +
  258 +Pour aller à l'écran suivant avec aucune option pour revenir à l'écran précédent (pour une utilisation dans SplashScreens, écrans de connexion, etc.)
  259 +
  260 +```dart
  261 +Get.off(NextScreen());
  262 +```
  263 +
  264 +Pour aller à l'écran suivant et annuler tous les itinéraires précédents (utile dans les paniers d'achat en ligne, les sondages et les tests)
  265 +
  266 +```dart
  267 +Get.offAll(NextScreen());
  268 +```
  269 +
  270 +Avez-vous remarqué que vous n'avez eu besoin d'utiliser 'context' pour aucune de ces opérations? C'est l'un des plus grands avantages de l'utilisation de la gestion de route avec Get. Avec cela, vous pouvez appeler toutes ces méthodes à partir de votre classe de contrôleur, sans soucis.
  271 +
  272 +### Plus de details sur la gestion de route
  273 +
  274 +**Get fonctionne avec des itinéraires nommés (named routes) et offre également un contrôle plus granulaire de vos routes! Il y a une documentation approfondie [ici](./documentation/fr_FR/route_management.md)**
  275 +
  276 +## Gestion des dependances
  277 +
  278 +Get a un gestionnaire de dépendances (dependency manager) simple et puissant qui vous permet de récupérer la même classe que votre Bloc ou Controller avec seulement 1 ligne de code, pas de 'context' Provider, pas d'inheritedWidget:
  279 +
  280 +```dart
  281 +Controller controller = Get.put(Controller()); // Au lieu de Controller controller = Controller();
  282 +```
  283 +
  284 +- Remarque: Si vous utilisez le gestionnaire d'état de Get, accordez plus d'attention à l'API 'Bindings', qui facilitera la connexion de vos Vues à vos contrôleurs.
  285 +
  286 +Au lieu d'instancier votre classe dans la classe que vous utilisez, vous l'instanciez dans l'instance Get, ce qui la rendra disponible dans toute votre application.
  287 +Vous pouvez donc utiliser votre contrôleur (ou classe Bloc) normalement.
  288 +
  289 +**Conseil:** La gestion des dépendances est découplée des autres parties du package, donc si, par exemple, votre application utilise déjà un gestionnaire d'état (n'importe lequel, peu importe), vous n'avez pas besoin de tout réécrire, vous pouvez l'utiliser avec l'injection de dépendance de Get sans aucun problème.
  290 +
  291 +```dart
  292 +controller.fetchApi();
  293 +```
  294 +
  295 +Imaginez que vous ayez parcouru de nombreuses routes et que vous ayez besoin de données qui ont été laissées dans votre contrôleur, vous auriez besoin d'un gestionnaire d'état combiné avec le 'Provider' ou 'Get_it', n'est-ce pas? Pas avec Get. Il vous suffit de demander à Get de "trouver" votre contrôleur, vous n'avez pas besoin de dépendances supplémentaires:
  296 +```dart
  297 +Controller controller = Get.find();
  298 +//Oui, cela ressemble à de la magie. Get trouvera votre contrôleur et vous le livrera. Vous pouvez avoir 1 million de contrôleurs instanciés, Get vous retournera toujours le bon contrôleur.
  299 +```
  300 +
  301 +Et puis vous pourrez récupérer les données de votre contrôleur obtenu précédemment:
  302 +
  303 +```dart
  304 +Text(controller.textFromApi);
  305 +```
  306 +
  307 +### Plus de details sur la gestion des dependances
  308 +
  309 +**Trouvez une explication plus détaillée sur la gestion des dépendances [ici](./documentation/fr_FR/dependency_management.md)**
  310 +
  311 +# Utils
  312 +
  313 +## Internationalization
  314 +
  315 +### Traductions
  316 +
  317 +Les traductions sont enregistrées sous forme de dictionaire clé-valeur simple.
  318 +Pour ajouter des traductions, créez une classe qui 'extend' `Translations`.
  319 +
  320 +```dart
  321 +import 'package:get/get.dart';
  322 +
  323 +class Messages extends Translations {
  324 + @override
  325 + Map<String, Map<String, String>> get keys => {
  326 + 'en_US': {
  327 + 'hello': 'Hello World',
  328 + },
  329 + 'de_DE': {
  330 + 'hello': 'Hallo Welt',
  331 + }
  332 + };
  333 +}
  334 +```
  335 +
  336 +#### Utiliser les traductions
  337 +
  338 +Ajouter juste `.tr` à la clé et elle sera traduite selon la valeur actuelle `Get.locale` et de `Get.fallbackLocale`.
  339 +
  340 +```dart
  341 +Text('title'.tr);
  342 +```
  343 +
  344 +#### Utiliser les traductions avec le singulier et le pluriel
  345 +
  346 +```dart
  347 +var products = [];
  348 +Text('cléAuSingulier'.trPlural('cléAuPluriel', products.length, Args));
  349 +```
  350 +
  351 +#### Utiliser les traductions avec paramètres
  352 +
  353 +```dart
  354 +import 'package:get/get.dart';
  355 +
  356 +
  357 +Map<String, Map<String, String>> get keys => {
  358 + 'en_US': {
  359 + 'logged_in': 'logged in as @name with email @email',
  360 + },
  361 + 'es_ES': {
  362 + 'logged_in': 'iniciado sesión como @name con e-mail @email',
  363 + }
  364 +};
  365 +
  366 +Text('logged_in'.trParams({
  367 + 'name': 'Jhon',
  368 + 'email': 'jhon@example.com'
  369 + }));
  370 +```
  371 +
  372 +### Locales
  373 +
  374 +'Locales' signifie lieux.
  375 +Pour definir les traductions, passer les paramètres 'locale' et 'translations' à GetMaterialApp.
  376 +
  377 +```dart
  378 +return GetMaterialApp(
  379 + translations: Messages(), // Vos traductions
  380 + locale: Locale('en', 'US'), // Les traductions seront faites dans cette 'locale' (langue)
  381 + fallbackLocale: Locale('en', 'UK'), // definit le 'language de secours' au cas oú un language invalide est sélectionné.
  382 +);
  383 +```
  384 +
  385 +#### Changer la locale
  386 +
  387 +Appelez `Get.updateLocale (locale)` pour mettre à jour la locale. Les traductions utilisent alors automatiquement la nouvelle langue.
  388 +
  389 +```dart
  390 +var locale = Locale('en', 'US');
  391 +Get.updateLocale(locale);
  392 +```
  393 +
  394 +#### Locale du systeme
  395 +
  396 +Pour lire les paramètres régionaux ('locales') du système, vous pouvez utiliser `Get.deviceLocale`.
  397 +
  398 +```dart
  399 +return GetMaterialApp(
  400 + locale: Get.deviceLocale,
  401 +);
  402 +```
  403 +
  404 +## Changer le Theme
  405 +
  406 +Veuillez ne pas utiliser de widget de niveau supérieur à `GetMaterialApp` pour le mettre à jour. Cela peut créer des clés ('keys') en double. Beaucoup de gens sont habitués à l'approche préhistorique de la création d'un widget "ThemeProvider" juste pour changer le thème de votre application, et ce n'est certainement PAS nécessaire avec **GetX ™**.
  407 +
  408 +Vous pouvez créer votre thème personnalisé et l'ajouter simplement dans `Get.changeTheme` sans aucune préconfiguration pour cela:
  409 +
  410 +```dart
  411 +Get.changeTheme(ThemeData.light());
  412 +```
  413 +
  414 +Si vous voulez créer quelque chose comme un bouton qui change le thème dans `onTap`, vous pouvez combiner deux API **GetX ™** pour cela:
  415 +
  416 +- L'API qui vérifie si le "Thème" sombre est utilisé.
  417 +- Et l'API de changement de thème, vous pouvez simplement le mettre dans un 'onPressed':
  418 +
  419 +```dart
  420 +Get.changeTheme(Get.isDarkMode? ThemeData.light(): ThemeData.dark());
  421 +```
  422 +
  423 +Lorsque 'onPressed' est appelé, si `.darkmode` est activé, il passera au _thème clair_, et lorsque le _thème clair_ est actif, il passera au _thème sombre_.
  424 +
  425 +## GetConnect
  426 +
  427 +GetConnect est un moyen facile de communiquer de votre backend à votre frontend avec http ou websockets.
  428 +
  429 +### Configuration par defaut
  430 +
  431 +Vous pouvez simplement 'extends' GetConnect et utiliser les méthodes GET / POST / PUT / DELETE / SOCKET pour communiquer avec votre API Rest ou vos websockets.
  432 +
  433 +```dart
  434 +class UserProvider extends GetConnect {
  435 + // Get request
  436 + Future<Response> getUser(int id) => get('http://youapi/users/$id');
  437 + // Post request
  438 + Future<Response> postUser(Map data) => post('http://youapi/users', body: data);
  439 + // Post request with File
  440 + Future<Response<CasesModel>> postCases(List<int> image) {
  441 + final form = FormData({
  442 + 'file': MultipartFile(image, filename: 'avatar.png'),
  443 + 'otherFile': MultipartFile(image, filename: 'cover.png'),
  444 + });
  445 + return post('http://youapi/users/upload', form);
  446 + }
  447 +
  448 + GetSocket userMessages() {
  449 + return socket('https://yourapi/users/socket');
  450 + }
  451 +}
  452 +```
  453 +
  454 +### Configuration personnalisee
  455 +
  456 +
  457 +GetConnect est hautement personnalisable. Vous pouvez définir l'URL de base, comme modificateurs de réponse, comme modificateurs de requêtes, définir un authentificateur, et même le nombre de tentatives oú il tentera de s'authentifier, en plus de donner la possibilité de définir un décodeur standard qui transformera toutes vos Requêtes dans vos Modèles sans aucune configuration supplémentaire.
  458 +
  459 +```dart
  460 +class HomeProvider extends GetConnect {
  461 + @override
  462 + void onInit() {
  463 + // Toute 'Request' passera à jsonEncode donc CasesModel.fromJson()
  464 + httpClient.defaultDecoder = CasesModel.fromJson;
  465 + httpClient.baseUrl = 'https://api.covid19api.com';
  466 + // baseUrl = 'https://api.covid19api.com';
  467 + // Il définit baseUrl pour Http et websockets si utilisé sans instance [httpClient]
  468 +
  469 + // Cela attachera la propriété 'apikey' sur l'en-tête ('header') de toutes les 'request's
  470 + httpClient.addRequestModifier((request) {
  471 + request.headers['apikey'] = '12345678';
  472 + return request;
  473 + });
  474 +
  475 + // Même si le serveur envoie des données avec le pays "Brésil",
  476 + // cela ne sera jamais affiché aux utilisateurs, car vous supprimez
  477 + // ces données de la réponse, même avant que la réponse ne soit délivrée
  478 + httpClient.addResponseModifier<CasesModel>((request, response) {
  479 + CasesModel model = response.body;
  480 + if (model.countries.contains('Brazil')) {
  481 + model.countries.remove('Brazil');
  482 + }
  483 + });
  484 +
  485 + httpClient.addAuthenticator((request) async {
  486 + final response = await get("http://yourapi/token");
  487 + final token = response.body['token'];
  488 + // Définit l'en-tête
  489 + request.headers['Authorization'] = "$token";
  490 + return request;
  491 + });
  492 +
  493 + // L'Autenticator sera appelé 3 fois si HttpStatus est HttpStatus.unauthorized
  494 + httpClient.maxAuthRetries = 3;
  495 + }
  496 +
  497 +
  498 + @override
  499 + Future<Response<CasesModel>> getCases(String path) => get(path);
  500 +}
  501 +```
  502 +
  503 +## Middleware GetPage
  504 +
  505 +GetPage a maintenant une nouvelle propriété qui prend une liste de GetMiddleWare et les exécute dans l'ordre spécifique.
  506 +
  507 +**Note**: Lorsque GetPage a un Middleware, tous les enfants de cette page auront automatiquement les mêmes middlewares.
  508 +
  509 +### Priority
  510 +
  511 +L'ordre des middlewares à exécuter peut être défini par la priorité dans GetMiddleware.
  512 +
  513 +```dart
  514 +final middlewares = [
  515 + GetMiddleware(priority: 2),
  516 + GetMiddleware(priority: 5),
  517 + GetMiddleware(priority: 4),
  518 + GetMiddleware(priority: -8),
  519 +];
  520 +```
  521 +
  522 +ces middlewares seront exécutés dans cet ordre **-8 => 2 => 4 => 5**
  523 +
  524 +### Redirect
  525 +
  526 + Cette fonction sera appelée lors de la recherche de la page de l'itinéraire appelé. Elle reçoit RouteSettings comme résultat vers oú rediriger. Sinon donnez-lui la valeur null et il n'y aura pas de redirection.
  527 +
  528 +```dart
  529 +GetPage redirect( ) {
  530 + final authService = Get.find<AuthService>();
  531 + return authService.authed.value ? null : RouteSettings(name: '/login');
  532 +}
  533 +```
  534 +
  535 +### onPageCalled
  536 +
  537 +Cette fonction sera appelée lorsque cette page sera appelée.
  538 +Vous pouvez l'utiliser pour changer quelque chose sur la page ou lui donner une nouvelle page.
  539 +
  540 +```dart
  541 +GetPage onPageCalled(GetPage page) {
  542 + final authService = Get.find<AuthService>();
  543 + return page.copyWith(title: 'Welcome ${authService.UserName}');
  544 +}
  545 +```
  546 +
  547 +### OnBindingsStart
  548 +
  549 +Cette fonction sera appelée juste avant l'initialisation des liaisons ('bidings').
  550 +Ici, vous pouvez modifier les liaisons de cette page.
  551 +
  552 +```dart
  553 +List<Bindings> onBindingsStart(List<Bindings> bindings) {
  554 + final authService = Get.find<AuthService>();
  555 + if (authService.isAdmin) {
  556 + bindings.add(AdminBinding());
  557 + }
  558 + return bindings;
  559 +}
  560 +```
  561 +
  562 +### OnPageBuildStart
  563 +
  564 +Cette fonction sera appelée juste après l'initialisation des liaisons ('bidings').
  565 +Ici, vous pouvez faire quelque chose après avoir créé les liaisons et avant de créer le widget de page.
  566 +
  567 +```dart
  568 +GetPageBuilder onPageBuildStart(GetPageBuilder page) {
  569 + print('les liaisons sont prêtes');
  570 + return page;
  571 +}
  572 +```
  573 +
  574 +### OnPageBuilt
  575 +Cette fonction sera appelée juste après l'appel de la fonction GetPage.page et vous donnera le résultat de la fonction et prendra le widget qui sera affiché.
  576 +
  577 +### OnPageDispose
  578 +
  579 +Cette fonction sera appelée juste après avoir disposé tous les objets associés (contrôleurs, vues, ...) à la page.
  580 +
  581 +## Autres APIs
  582 +
  583 +```dart
  584 +// donne les arguments actuels de currentScreen
  585 +Get.arguments
  586 +
  587 +// donne le nom de l'itinéraire précédent
  588 +Get.previousRoute
  589 +
  590 +// donne la route brute d'accès par exemple, rawRoute.isFirst()
  591 +Get.rawRoute
  592 +
  593 +// donne accès à l'API de routing de GetObserver
  594 +Get.routing
  595 +
  596 +// vérifier si le snackbar est ouvert
  597 +Get.isSnackbarOpen
  598 +
  599 +// vérifier si la boîte de dialogue est ouverte
  600 +Get.isDialogOpen
  601 +
  602 +// vérifie si la bottomSheet est ouverte
  603 +Get.isBottomSheetOpen
  604 +
  605 +// supprime une route.
  606 +Get.removeRoute()
  607 +
  608 +// retourne à plusieurs reprises jusqu'à ce que le prédicat retourne 'true'.
  609 +Get.until()
  610 +
  611 +// passe à la route suivante et supprime toutes les routes précédentes jusqu'à ce que le prédicat retourne 'true'.
  612 +Get.offUntil()
  613 +
  614 +// passe à la route nommée suivante et supprime toutes les routes précédentes jusqu'à ce que le prédicat retourne 'true'.
  615 +Get.offNamedUntil()
  616 +
  617 +// Vérifie sur quelle plate-forme l'application s'exécute
  618 +GetPlatform.isAndroid
  619 +GetPlatform.isIOS
  620 +GetPlatform.isMacOS
  621 +GetPlatform.isWindows
  622 +GetPlatform.isLinux
  623 +GetPlatform.isFuchsia
  624 +
  625 +// Vérifie le type d'appareil
  626 +GetPlatform.isMobile
  627 +GetPlatform.isDesktop
  628 +// Toutes les plates-formes sont prises en charge indépendamment, dans le Web!
  629 +// Vous pouvez dire si vous utilisez un navigateur
  630 +// sur Windows, iOS, OSX, Android, etc.
  631 +GetPlatform.isWeb
  632 +
  633 +
  634 +// Équivaut à: MediaQuery.of(context).size.height,
  635 +// mais immuable.
  636 +Get.height
  637 +Get.width
  638 +
  639 +// Donne le 'context' actuel de 'Navigator'.
  640 +Get.context
  641 +
  642 +// Donne le contexte du snackbar / dialogue / bottomsheet au premier plan, n'importe où dans votre code.
  643 +Get.contextOverlay
  644 +
  645 +// Remarque: les méthodes suivantes sont des extensions sur le 'context'. Puisque vous
  646 +// avez accès au contexte à n'importe quel endroit de votre interface utilisateur, vous pouvez l'utiliser n'importe où dans le code de l'interface utilisateur
  647 +
  648 +// Si vous avez besoin d'une hauteur / largeur variable (comme les fenêtres de bureau ou de navigateur qui peuvent être mises à l'échelle), vous devrez utiliser le contexte.
  649 +context.width
  650 +context.height
  651 +
  652 +// Vous donne le pouvoir de définir la moitié de l'écran, un tiers de celui-ci et ainsi de suite.
  653 +// Utile pour les applications responsives.
  654 +// paramètre dividedBy (double) optionnel - par défaut: 1
  655 +// paramètre reducedBy (double) facultatif - par défaut: 0
  656 +context.heightTransformer ()
  657 +context.widthTransformer ()
  658 +
  659 +/// Similaire à MediaQuery.of(context).size
  660 +context.mediaQuerySize()
  661 +
  662 +/// Similaire à MediaQuery.of(context).padding
  663 +context.mediaQueryPadding()
  664 +
  665 +/// Similaire à MediaQuery.of(context).viewPadding
  666 +context.mediaQueryViewPadding()
  667 +
  668 +/// Similaire à MediaQuery.of(context).viewInsets;
  669 +context.mediaQueryViewInsets()
  670 +
  671 +/// Similaire à MediaQuery.of(context).orientation;
  672 +context.orientation()
  673 +
  674 +/// Vérifie si l'appareil est en mode paysage
  675 +context.isLandscape()
  676 +
  677 +/// Vérifie si l'appareil est en mode portrait
  678 +context.isPortrait()
  679 +
  680 +/// Similaire à MediaQuery.of(context).devicePixelRatio;
  681 +context.devicePixelRatio()
  682 +
  683 +/// Similaire à MediaQuery.of(context).textScaleFactor;
  684 +context.textScaleFactor()
  685 +
  686 +/// Obtenir le côté le plus court de l'écran
  687 +context.mediaQueryShortestSide()
  688 +
  689 +/// Vrai si la largeur est supérieure à 800p
  690 +context.showNavbar()
  691 +
  692 +/// Vrai si le côté le plus court est inférieur à 600p
  693 +context.isPhone()
  694 +
  695 +/// Vrai si le côté le plus court est plus grand que 600p
  696 +context.isSmallTablet()
  697 +
  698 +/// Vrai si le côté le plus court est plus grand que 720p
  699 +context.isLargeTablet()
  700 +
  701 +/// Vrai si l'appareil actuel est une tablette
  702 +context.isTablet()
  703 +
  704 +/// Renvoie une valeur <T> en fonction de la taille de l'écran
  705 +/// peut donner une valeur pour:
  706 +/// watch: si le côté le plus court est inférieur à 300
  707 +/// mobile: si le côté le plus court est inférieur à 600
  708 +/// tablette: si le côté le plus court est inférieur à 1200
  709 +/// bureautique: si la largeur est supérieure à 1200
  710 +context.responsiveValue<T>()
  711 +```
  712 +
  713 +### Parametres globaux et configurations manuelles facultatifs
  714 +
  715 +GetMaterialApp configure tout pour vous, mais si vous souhaitez configurer Get manuellement:
  716 +
  717 +```dart
  718 +MaterialApp(
  719 + navigatorKey: Get.key,
  720 + navigatorObservers: [GetObserver()],
  721 +);
  722 +```
  723 +
  724 +Vous pourrez également utiliser votre propre middleware dans `GetObserver`, cela n'influencera rien.
  725 +
  726 +```dart
  727 +MaterialApp(
  728 + navigatorKey: Get.key,
  729 + navigatorObservers: [
  730 + GetObserver(MiddleWare.observer) // Ici
  731 + ],
  732 +);
  733 +```
  734 +
  735 +Vous pouvez créer _Global Settings_ pour `Get`. Ajoutez simplement `Get.config` à votre code avant de changer de route.
  736 +Ou faites-le directement dans votre `GetMaterialApp`
  737 +
  738 +```dart
  739 +GetMaterialApp(
  740 + enableLog: true,
  741 + defaultTransition: Transition.fade,
  742 + opaqueRoute: Get.isOpaqueRouteDefault,
  743 + popGesture: Get.isPopGestureEnable,
  744 + transitionDuration: Get.defaultDurationTransition,
  745 + defaultGlobalState: Get.defaultGlobalState,
  746 +);
  747 +
  748 +Get.config(
  749 + enableLog = true,
  750 + defaultPopGesture = true,
  751 + defaultTransition = Transitions.cupertino
  752 +)
  753 +```
  754 +
  755 +Vous pouvez éventuellement rediriger tous les messages de journalisation (logging) de `Get`.
  756 +Si vous souhaitez utiliser votre propre package de journalisation préféré,
  757 +et souhaitez capturer les logs là-bas:
  758 +
  759 +```dart
  760 +GetMaterialApp(
  761 + enableLog: true,
  762 + logWriterCallback: localLogWriter,
  763 +);
  764 +
  765 +void localLogWriter(String text, {bool isError = false}) {
  766 + // transmettez le message à votre package de journalisation préféré ici
  767 + // veuillez noter que même si enableLog: false, les messages du journal seront poussés dans ce 'callback'
  768 + // vérifiez le 'flag' si vous le souhaitez via GetConfig.isLogEnable
  769 +}
  770 +
  771 +```
  772 +
  773 +### State Widgets Locaux
  774 +
  775 +Ces Widgets vous permettent de gérer une valeur unique, et de garder l'état éphémère et localement.
  776 +Nous avons des saveurs pour réactif et simple.
  777 +Par exemple, vous pouvez les utiliser pour basculer obscureText dans un `TextField`, peut-être créer un
  778 +Panneau extensible, ou peut-être modifier l'index actuel dans `BottomNavigationBar` tout en modifiant le contenu
  779 +de 'body' dans un `Scaffold`.
  780 +
  781 +#### ValueBuilder
  782 +
  783 +Une simplification de `StatefulWidget` qui fonctionne avec un callback `.setState` qui prend la valeur mise à jour.
  784 +
  785 +```dart
  786 +ValueBuilder<bool>(
  787 + initialValue: false,
  788 + builder: (value, updateFn) => Switch(
  789 + value: value,
  790 + onChanged: updateFn, // même signature! vous pouvez utiliser (newValue) => updateFn (newValue)
  791 + ),
  792 + // si vous devez appeler quelque chose en dehors de la méthode du builder.
  793 + onUpdate: (value) => print("Valeur mise à jour: $value"),
  794 + onDispose: () => print("Widget détruit"),
  795 +),
  796 +```
  797 +
  798 +#### ObxValue
  799 +
  800 +Similaire à [`ValueBuilder`](#valuebuilder), mais c'est la version Reactive, vous passez une instance Rx (rappelez-vous les .obs magiques?) et il
  801 + se met à jour automatiquement ... n'est-ce pas génial?
  802 +
  803 +```dart
  804 +ObxValue((data) => Switch(
  805 + value: data.value,
  806 + onChanged: data, // Rx a une fonction _callable_! Vous pouvez utiliser (flag) => data.value = flag,
  807 + ),
  808 + false.obs,
  809 +),
  810 +```
  811 +
  812 +## Conseils utiles
  813 +
  814 +`.obs`ervables (également appelés types _Rx_) ont une grande variété de méthodes et d'opérateurs internes.
  815 +
  816 +> Il est très courant de croire qu'une propriété avec `.obs` ** EST ** la valeur réelle ... mais ne vous y trompez pas!
  817 +> Nous évitons la déclaration Type de la variable, car le compilateur de Dart est assez intelligent, et le code
  818 +> semble plus propre, mais:
  819 +
  820 +```dart
  821 +var message = 'Hello world'.obs;
  822 +print( 'Message "$message" est de Type ${message.runtimeType}');
  823 +```
  824 +
  825 +Bien que `message` _prints_ la vraie valeur du String, le Type est **RxString**!
  826 +
  827 +Donc, vous ne pouvez pas faire `message.substring( 0, 4 )`.
  828 +Vous devez utiliser la vraie `valeur` dans _observable_:
  829 +La façon "la plus utilisée" est `.value`, mais, que vous pouviez aussi...
  830 +
  831 +```dart
  832 +final name = 'GetX'.obs;
  833 +// "met à jour" le flux, uniquement si la valeur est différente de la valeur actuelle.
  834 +name.value = 'Hey';
  835 +
  836 +// Toutes les propriétés Rx sont "appelables" et renvoie la nouvelle valeur.
  837 +// mais cette approche n'accepte pas `null`, l'interface utilisateur ne sera pas reconstruite.
  838 +name('Hello');
  839 +
  840 +// est comme un getter, affiche `Hello`.
  841 +name() ;
  842 +
  843 +/// nombres:
  844 +
  845 +final count = 0.obs;
  846 +
  847 +// Vous pouvez utiliser toutes les opérations non mutables à partir de num primitives!
  848 +count + 1;
  849 +
  850 +// Fais attention! ceci n'est valable que si `count` n'est pas final, mais var
  851 +count += 1;
  852 +
  853 +// Vous pouvez également comparer avec des valeurs:
  854 +count > 2;
  855 +
  856 +/// booleans:
  857 +
  858 +final flag = false.obs;
  859 +
  860 +// bascule la valeur entre true / false
  861 +flag.toggle();
  862 +
  863 +
  864 +/// tous les types:
  865 +
  866 +// Définit la `valeur` sur null.
  867 +flag.nil();
  868 +
  869 +// Toutes les opérations toString (), toJson () sont transmises à la `valeur`
  870 +print( count ); // appelle `toString ()` à l'intérieur de RxInt
  871 +
  872 +final abc = [0,1,2].obs;
  873 +// Convertit la valeur en un Array json, affiche RxList
  874 +// Json est pris en charge par tous les types Rx!
  875 +print('json: ${jsonEncode(abc)}, type: ${abc.runtimeType}');
  876 +
  877 +// RxMap, RxList et RxSet sont des types Rx spéciaux, qui étendent leurs types natifs.
  878 +// mais vous pouvez travailler avec une liste comme une liste régulière, bien qu'elle soit réactive!
  879 +abc.add(12); // pousse 12 dans la liste et MET À JOUR le flux.
  880 +abc[3]; // comme Lists, lit l'index 3.
  881 +
  882 +
  883 +// l'égalité fonctionne avec le Rx et la valeur, mais hashCode est toujours pris à partir de la valeur
  884 +final number = 12.obs;
  885 +print( number == 12 ); // retource > true
  886 +
  887 +/// Modèles Rx personnalisés:
  888 +
  889 +// toJson (), toString () sont différés à l'enfant, vous pouvez donc implémenter 'override' sur eux, et print() l'observable directement.
  890 +
  891 +class User {
  892 + String name, last;
  893 + int age;
  894 + User({this.name, this.last, this.age});
  895 +
  896 + @override
  897 + String toString() => '$name $last, $age ans';
  898 +}
  899 +
  900 +final user = User(name: 'John', last: 'Doe', age: 33).obs;
  901 +
  902 +// `user` est" réactif ", mais les propriétés à l'intérieur NE SONT PAS!
  903 +// Donc, si nous changeons une variable à l'intérieur ...
  904 +user.value.name = 'Roi';
  905 +// Le widget ne se reconstruira pas !,
  906 +// `Rx` n'a aucun indice lorsque vous changez quelque chose à l'intérieur de l'utilisateur.
  907 +// Donc, pour les classes personnalisées, nous devons "notifier" manuellement le changement.
  908 +user.refresh();
  909 +
  910 +// ou utiliser `update()`!
  911 +user.update((value){
  912 + value.name='Roi';
  913 +});
  914 +
  915 +print( user );
  916 +```
  917 +
  918 +#### GetView
  919 +
  920 +J'adore ce widget. Si simple, mais si utile!
  921 +
  922 +C'est un widget `const Stateless` qui a un getter` controller` pour un `Controller` enregistré, c'est tout.
  923 +
  924 +```dart
  925 + class AwesomeController extends GetxController {
  926 + final String title = 'My Awesome View';
  927 + }
  928 +
  929 + // N'oubliez PAS de passer le `Type` que vous avez utilisé pour enregistrer votre contrôleur!
  930 + class AwesomeView extends GetView<AwesomeController> {
  931 + @override
  932 + Widget build(BuildContext context) {
  933 + return Container(
  934 + padding: EdgeInsets.all(20),
  935 + child: Text(controller.title), // appelez `controller.quelqueChose`
  936 + );
  937 + }
  938 + }
  939 +```
  940 +
  941 +#### GetResponsiveView
  942 +
  943 +Étendez ce widget pour créer une vue réactive.
  944 +ce widget contient la propriété `screen` qui a toutes les
  945 +informations sur la taille et le type de l'écran.
  946 +
  947 +##### Guide d utilisation
  948 +
  949 +Vous avez deux options pour le créer:
  950 +
  951 +- avec la méthode `builder` vous renvoyez le widget à construire.
  952 +- avec les méthodes `desktop`,` tablet`, `phone`,` watch`. la méthode spécifique sera exécutée lorsque le type d'écran correspond à la méthode.
  953 + Lorsque l'écran est [ScreenType.Tablet], la méthode `tablet` sera exécutée et ainsi de suite.
  954 + **Note:** Si vous utilisez cette méthode, veuillez définir la propriété `alwaysUseBuilder` à `false`
  955 +
  956 +Avec la propriété `settings`, vous pouvez définir la limite de largeur pour les types d'écran.
  957 +
  958 +![exemple](https://github.com/SchabanBo/get_page_example/blob/master/docs/Example.gif?raw=true)
  959 +Code pour cet écran
  960 +[code](https://github.com/SchabanBo/get_page_example/blob/master/lib/pages/responsive_example/responsive_view.dart)
  961 +
  962 +#### GetWidget
  963 +
  964 +La plupart des gens n'ont aucune idée de ce widget ou confondent totalement son utilisation.
  965 +Le cas d'utilisation est très rare, mais très spécifique: il `met en cache` un contrôleur.
  966 +En raison du _cache_, ne peut pas être un `const Stateless`.
  967 +
  968 +> Alors, quand avez-vous besoin de "mettre en cache" un contrôleur?
  969 +
  970 +Si vous utilisez, une autre fonctionnalité "pas si courante" de **GetX**: `Get.create()`.
  971 +
  972 +`Get.create(()=>Controller())` générera un nouveau `Controller` chaque fois que vous appelez
  973 +`Get.find<Controller>()`.
  974 +
  975 +C'est là que `GetWidget` brille ... comme vous pouvez l'utiliser, par exemple,
  976 +pour conserver une liste de <Todo>s. Donc, si le widget est "reconstruit", il conservera la même instance de contrôleur.
  977 +
  978 +#### GetxService
  979 +
  980 +Cette classe est comme un `GetxController`, elle partage le même cycle de vie ( `onInit()`, `onReady()`, `onClose()`), mais n'a pas de "logique" en elle.
  981 +Il notifie simplement le **GetX** Dependency Injection system, que cette sous-classe
  982 +**ne peut pas** être supprimé de la mémoire.
  983 +
  984 +Donc est très utile pour garder vos "Services" toujours à portée de main et actifs avec `Get.find()`. Comme:
  985 +`ServiceAPI`, `ServiceDeSauvegarde`, `ServiceDeCaching`.
  986 +
  987 +```dart
  988 +Future<void> main() async {
  989 + await initServices(); /// Attend l'initialisation des services.
  990 + runApp(SomeApp());
  991 +}
  992 +
  993 +/// Est une démarche intelligente pour que vos services s'initialisent avant d'exécuter l'application Flutter.
  994 +/// car vous pouvez contrôler le flux d'exécution (peut-être devez-vous charger une configuration de thème,
  995 +/// apiKey, langue définie par l'utilisateur ... donc chargez SettingService avant d'exécuter ApiService.
  996 +/// donc GetMaterialApp () n'a pas besoin de se reconstruire et prend les valeurs directement.
  997 +void initServices() async {
  998 + print('starting services ...');
  999 + /// C'est ici que vous mettez get_storage, hive, shared_pref initialization.
  1000 + /// ou les connexions moor, ou autres choses async.
  1001 + await Get.putAsync(() => DbService().init());
  1002 + await Get.putAsync(SettingsService()).init();
  1003 + print('Tous les services ont démarré...');
  1004 +}
  1005 +
  1006 +class DbService extends GetxService {
  1007 + Future<DbService> init() async {
  1008 + print('$runtimeType retarde de 2 sec');
  1009 + await 2.delay();
  1010 + print('$runtimeType prêts!');
  1011 + return this;
  1012 + }
  1013 +}
  1014 +
  1015 +class SettingsService extends GetxService {
  1016 + void init() async {
  1017 + print("$runtimeType retarde d'1 sec");
  1018 + await 1.delay();
  1019 + print('$runtimeType prêts!');
  1020 + }
  1021 +}
  1022 +
  1023 +```
  1024 +
  1025 +La seule façon de supprimer réellement un `GetxService`, est d'utiliser` Get.reset () `qui est comme un
  1026 +"Hot Reboot" de votre application. N'oubliez donc pas que si vous avez besoin d'une persistance absolue d'une instance de classe
  1027 +durée de vie de votre application, utilisez `GetxService`.
  1028 +
  1029 +# Changements par rapport a 2.0
  1030 +
  1031 +1- Types Rx:
  1032 +
  1033 +| Avant | Après |
  1034 +| ------- | ---------- |
  1035 +| StringX | `RxString` |
  1036 +| IntX | `RxInt` |
  1037 +| MapX | `RxMap` |
  1038 +| ListX | `RxList` |
  1039 +| NumX | `RxNum` |
  1040 +| DoubleX | `RxDouble` |
  1041 +
  1042 +RxController et GetBuilder ont maintenant fusionné, vous n'avez plus besoin de mémoriser le contrôleur que vous souhaitez utiliser, utilisez simplement GetxController, cela fonctionnera pour une gestion simple de l'état et également pour la réactivité.
  1043 +
  1044 +
  1045 +2- NamedRoutes
  1046 +
  1047 +Avant:
  1048 +
  1049 +```dart
  1050 +GetMaterialApp(
  1051 + namedRoutes: {
  1052 + '/': GetRoute(page: Home()),
  1053 + }
  1054 +)
  1055 +```
  1056 +
  1057 +Maintenant:
  1058 +
  1059 +```dart
  1060 +GetMaterialApp(
  1061 + getPages: [
  1062 + GetPage(name: '/', page: () => Home()),
  1063 + ]
  1064 +)
  1065 +```
  1066 +
  1067 +Pourquoi ce changement?
  1068 +Souvent, il peut être nécessaire de décider quelle page sera affichée à partir d'un paramètre, ou d'un 'login token', l'approche précédente était inflexible, car elle ne le permettait pas.
  1069 +L'insertion de la page dans une fonction a considérablement réduit la consommation de RAM, puisque les routes ne seront pas allouées en mémoire depuis le démarrage de l'application, et cela a également permis de faire ce type d'approche:
  1070 +```dart
  1071 +
  1072 +GetStorage box = GetStorage();
  1073 +
  1074 +GetMaterialApp(
  1075 + getPages: [
  1076 + GetPage(name: '/', page:(){
  1077 + return box.hasData('token') ? Home() : Login();
  1078 + })
  1079 + ]
  1080 +)
  1081 +```
  1082 +
  1083 +# Pourquoi Getx?
  1084 +
  1085 +1- Plusieurs fois après une mise à jour de Flutter, plusieurs de vos packages seront invalides. Parfois, des erreurs de compilation se produisent, des erreurs apparaissent souvent pour lesquelles il n'y a toujours pas de réponses, et le développeur doit savoir d'où vient l'erreur, suivre l'erreur, puis seulement essayer d'ouvrir un problème dans le référentiel correspondant et voir son problème résolu. Get centralise les principales ressources pour le développement (gestion des états, des dépendances et des routes), vous permettant d'ajouter un package unique à votre pubspec et de commencer à travailler. Après une mise à jour Flutter, la seule chose à faire est de mettre à jour la dépendance Get et de vous mettre au travail. Get résout également les problèmes de compatibilité. Combien de fois une version d'un package n'est pas compatible avec la version d'un autre, parce que l'une utilise une dépendance dans une version et l'autre dans une autre version? Ce n'est pas non plus un problème avec Get, car tout est dans le même package et est entièrement compatible.
  1086 +
  1087 +2- Flutter est facile, Flutter est incroyable, mais Flutter a encore quelques règles standard qui peuvent être indésirables pour la plupart des développeurs, comme `Navigator.of (context) .push (context, builder [...]`. Get simplifie le développement. Au lieu de écrire 8 lignes de code pour simplement appeler une route, vous pouvez simplement le faire: `Get.to (Home ())` et vous avez terminé, vous passerez à la page suivante. Les URL Web dynamiques sont une chose vraiment pénible à voir avec Flutter actuellement, et cela avec GetX est stupidement simple. La gestion des états dans Flutter et la gestion des dépendances sont également quelque chose qui génère beaucoup de discussions, car il y a des centaines de modèles dans la pub. Mais rien n'est aussi simple que d'ajouter un ".obs" à la fin de votre variable, et placez votre widget dans un Obx, et c'est tout, toutes les mises à jour de cette variable seront automatiquement mises à jour à l'écran.
  1088 +
  1089 +3- Facilité sans vous soucier des performances. Les performances de Flutter sont déjà étonnantes, mais imaginez que vous utilisez un gestionnaire d'état et un localisateur pour distribuer vos classes blocs / stores / contrôleurs / etc. Vous devrez appeler manuellement l'exclusion de cette dépendance lorsque vous n'en avez pas besoin. Mais avez-vous déjà pensé à simplement utiliser votre «contrôleur`, et quand il n'était plus utilisé par personne, il serait simplement supprimé de la mémoire? C'est ce que fait GetX. Avec SmartManagement, tout ce qui n'est pas utilisé est supprimé de la mémoire et vous ne devriez pas avoir à vous soucier d'autre chose que de la programmation. Vous serez assuré de consommer le minimum de ressources nécessaires, sans même avoir créé de logique pour cela.
  1090 +
  1091 +4- Découplage réel. Vous avez peut-être entendu le concept "séparer la vue de la business logic". Ce n'est pas une particularité de BLoC, MVC, MVVM, et tout autre standard sur le marché a ce concept. Cependant, ce concept peut souvent être atténué dans Flutter en raison de l'utilisation de `context`.
  1092 + Si vous avez besoin de contexte pour trouver un InheritedWidget, vous en avez besoin dans la vue, ou passez le `context` par paramètre. Je trouve particulièrement cette solution très moche, et pour travailler en équipe, nous serons toujours dépendants de la 'business logic' de View. Getx n'est pas orthodoxe avec l'approche standard, et même s'il n'interdit pas complètement l'utilisation de StatefulWidgets, InitState, etc., il a toujours une approche similaire qui peut être plus propre. Les contrôleurs ont des cycles de vie, et lorsque vous devez faire une requête APIREST par exemple, vous ne dépendez de rien de la vue. Vous pouvez utiliser onInit pour lancer l'appel http et lorsque les données arrivent, les variables sont remplies. Comme GetX est totalement réactif (vraiment, et fonctionne sous streams), une fois les éléments remplis, tous les widgets qui utilisent cette variable seront automatiquement mis à jour dans la vue.
  1093 + Cela permet aux personnes ayant une expertise de l'interface utilisateur de travailler uniquement avec des widgets et de ne pas avoir à envoyer quoi que ce soit à la business logic autre que des événements utilisateur (comme cliquer sur un bouton), tandis que les personnes travaillant avec la business logic seront libres de créer et de tester la Business logic séparément.
  1094 +
  1095 +
  1096 +# Communite
  1097 +
  1098 +## Chaines communautaires
  1099 +
  1100 +GetX a une communauté très active et utile. Si vous avez des questions, ou souhaitez obtenir de l'aide concernant l'utilisation de ce framework, veuillez rejoindre nos canaux communautaires, votre question sera répondue plus rapidement, et ce sera l'endroit le plus approprié. Ce référentiel est exclusif pour l'ouverture des issues Github et la demande de ressources, mais n'hésitez pas à faire partie de la communauté GetX.
  1101 +| **Slack** | **Discord** | **Telegram** |
  1102 +| :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------- |
  1103 +| [![Get sur 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) |
  1104 +
  1105 +## Comment contribuer
  1106 +
  1107 +_Voulez-vous contribuer au projet? Nous serons fiers de vous mettre en avant comme l'un de nos collaborateurs. Voici quelques points sur lesquels vous pouvez contribuer et améliorer encore Get (et Flutter)._
  1108 +
  1109 +- Aider à traduire les 'Readme's dans d'autres langues.
  1110 +- Ajout de documentation au readme (beaucoup de fonctions de Get n'ont pas encore été documentées).
  1111 +- Rédiger des articles ou réaliser des vidéos pour apprendre à utiliser Get (ils seront insérés dans le Readme et à l'avenir dans notre Wiki).
  1112 +- Offrir des PRs pour code / tests.
  1113 +- Ajouter de nouvelles fonctions.
  1114 +
  1115 +Toute contribution est bienvenue!
  1116 +
  1117 +## Articles et videos
  1118 +
  1119 +- [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).
  1120 +- [Complete GetX™ Navigation](https://www.youtube.com/watch?v=RaqPIoJSTtI) - Route management video by Amateur Coder.
  1121 +- [Complete GetX State Management](https://www.youtube.com/watch?v=CNpXbeI_slw) - State management video by Amateur Coder.
  1122 +- [GetX™ Other Features](https://youtu.be/ttQtlX_Q0eU) - Utils, storage, bindings and other features video by Amateur Coder.
  1123 +- [Firestore User with GetX | Todo App](https://www.youtube.com/watch?v=BiV0DcXgk58) - Video by Amateur Coder.
  1124 +- [Firebase Auth with GetX | Todo App](https://www.youtube.com/watch?v=-H-T_BSgfOE) - Video by Amateur Coder.
  1125 +- [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).
  1126 +- [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).
  1127 +- [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.
  1128 +- [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.
  1129 +- [GetX Flutter Firebase Auth Example](https://medium.com/@jeffmcmorris/getx-flutter-firebase-auth-example-b383c1dd1de2) - Article by Jeff McMorris.
  1130 +- [Flutter State Management with GetX – Complete App](https://www.appwithflutter.com/flutter-state-management-with-getx/) - by App With Flutter.
  1131 +- [Flutter Routing with Animation using Get Package](https://www.appwithflutter.com/flutter-routing-using-get-package/) - by App With Flutter.
1 ![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) 1 ![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png)
2 2
3 -**Bahasa: Indonesia (file ini), [Inggris](README.md), [Urdu](README.ur-PK.md), [China](README.zh-cn.md), [Portugis (Brazil)](README.pt-br.md), [Spanyol](README-es.md), [Russia](README.ru.md), [Polandia](README.pl.md), [Korea](README.ko-kr.md).** 3 +**Bahasa: Indonesia (file ini), [Inggris](README.md), [Urdu](README.ur-PK.md), [China](README.zh-cn.md), [Portugis (Brazil)](README.pt-br.md), [Spanyol](README-es.md), [Russia](README.ru.md), [Polandia](README.pl.md), [Korea](README.ko-kr.md), [French](README-fr.md)**
4 4
5 [![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get) 5 [![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get)
6 [![likes](https://badges.bar/get/likes)](https://pub.dev/packages/get/score) 6 [![likes](https://badges.bar/get/likes)](https://pub.dev/packages/get/score)
@@ -148,7 +148,7 @@ class Home extends StatelessWidget { @@ -148,7 +148,7 @@ class Home extends StatelessWidget {
148 appBar: AppBar(title: Obx(() => Text("Clicks: ${c.count}"))), 148 appBar: AppBar(title: Obx(() => Text("Clicks: ${c.count}"))),
149 149
150 // Ganti 8 baris Navigator.push menggunan Get.to() agar lebih sederhana. Anda tidak perlu `context`. 150 // Ganti 8 baris Navigator.push menggunan Get.to() agar lebih sederhana. Anda tidak perlu `context`.
151 - body: Center(child: RaisedButton( 151 + body: Center(child: ElevatedButton(
152 child: Text("Go to Other"), onPressed: () => Get.to(Other()))), 152 child: Text("Go to Other"), onPressed: () => Get.to(Other()))),
153 floatingActionButton: 153 floatingActionButton:
154 FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment)); 154 FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment));
1 ![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) 1 ![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png)
2 2
3 -**언어: [우르두어](README.ur-PK.md), [영어](README.md), [인도네시아 인](README.id-ID.md), [중국어](README.zh-cn.md), [브라질 포르투칼어](README.pt-br.md), [스페인어](README-es.md), [러시아어](README.ru.md), [폴란드어](README.pl.md), 한국어(이파일).** 3 +**언어: [우르두어](README.ur-PK.md), [영어](README.md), [인도네시아 인](README.id-ID.md), [중국어](README.zh-cn.md), [브라질 포르투칼어](README.pt-br.md), [스페인어](README-es.md), [러시아어](README.ru.md), [폴란드어](README.pl.md), 한국어(이파일), [French](README-fr.md)**
4 4
5 [![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get) 5 [![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get)
6 [![likes](https://badges.bar/get/likes)](https://pub.dev/packages/get/score) 6 [![likes](https://badges.bar/get/likes)](https://pub.dev/packages/get/score)
@@ -16,9 +16,9 @@ @@ -16,9 +16,9 @@
16 16
17 ![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/getx.png) 17 ![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/getx.png)
18 18
19 -- [Get에 대하여](#Get에-대하여) 19 +- [Get에 대하여](#get에-대하여)
20 - [설치](#설치) 20 - [설치](#설치)
21 -- [GetX를 사용한 Counter 앱](#GetX를-사용한-Counter-앱) 21 +- [GetX를 사용한 Counter 앱](#getx를-사용한-counter-앱)
22 - [세가지 주요점](#세가지-주요점) 22 - [세가지 주요점](#세가지-주요점)
23 - [상태 관리](#상태-관리) 23 - [상태 관리](#상태-관리)
24 - [반응형 상태 관리자](#반응형-상태-관리자) 24 - [반응형 상태 관리자](#반응형-상태-관리자)
@@ -46,7 +46,7 @@ @@ -46,7 +46,7 @@
46 - [OnPageBuildStart](#onpagebuildstart) 46 - [OnPageBuildStart](#onpagebuildstart)
47 - [OnPageBuilt](#onpagebuilt) 47 - [OnPageBuilt](#onpagebuilt)
48 - [OnPageDispose](#onpagedispose) 48 - [OnPageDispose](#onpagedispose)
49 - - [기타 고급 API](#기타-고급-API) 49 + - [기타 고급 API](#기타-고급-api)
50 - [선택적 전역 설정과 수동 구성](#선택적-전역-설정과-수동-구성) 50 - [선택적 전역 설정과 수동 구성](#선택적-전역-설정과-수동-구성)
51 - [지역 상태 위젯들](#지역-상태-위젯들) 51 - [지역 상태 위젯들](#지역-상태-위젯들)
52 - [ValueBuilder](#valuebuilder) 52 - [ValueBuilder](#valuebuilder)
@@ -55,8 +55,8 @@ @@ -55,8 +55,8 @@
55 - [GetView](#getview) 55 - [GetView](#getview)
56 - [GetWidget](#getwidget) 56 - [GetWidget](#getwidget)
57 - [GetxService](#getxservice) 57 - [GetxService](#getxservice)
58 -- [2.0의 주요 변경점](#2.0의-주요-변경점)  
59 -- [왜-Getx인가?](#왜-Getx인가?) 58 +- [2.0의 주요 변경점](#20의-주요-변경점)
  59 +- [왜 Getx인가?](#왜-getx인가)
60 - [커뮤니티](#커뮤니티) 60 - [커뮤니티](#커뮤니티)
61 - [커뮤니티 채널](#커뮤니티-채널) 61 - [커뮤니티 채널](#커뮤니티-채널)
62 - [기여하는 방법](#기여하는-방법) 62 - [기여하는 방법](#기여하는-방법)
@@ -145,7 +145,7 @@ class Home extends StatelessWidget { @@ -145,7 +145,7 @@ class Home extends StatelessWidget {
145 appBar: AppBar(title: Obx(() => Text("Clicks: ${c.count}"))), 145 appBar: AppBar(title: Obx(() => Text("Clicks: ${c.count}"))),
146 146
147 // 8줄의 Navigator.push를 간단한 Get.to()로 변경합니다. context는 필요없습니다. 147 // 8줄의 Navigator.push를 간단한 Get.to()로 변경합니다. context는 필요없습니다.
148 - body: Center(child: RaisedButton( 148 + body: Center(child: ElevatedButton(
149 child: Text("Go to Other"), onPressed: () => Get.to(Other()))), 149 child: Text("Go to Other"), onPressed: () => Get.to(Other()))),
150 floatingActionButton: 150 floatingActionButton:
151 FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment)); 151 FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment));
@@ -188,7 +188,7 @@ Get은 두가지 상태 관리자가 있습니다: 단순 상태관리자(GetBui @@ -188,7 +188,7 @@ Get은 두가지 상태 관리자가 있습니다: 단순 상태관리자(GetBui
188 - 각 변수에 대해 StreamBuilder를 만들 필요가 없습니다. 188 - 각 변수에 대해 StreamBuilder를 만들 필요가 없습니다.
189 - 각각의 상태(state)를 위한 클래스를 만들 필요가 없습니다. 189 - 각각의 상태(state)를 위한 클래스를 만들 필요가 없습니다.
190 - 초기값을 위한 get이 필요하지 않습니다. 190 - 초기값을 위한 get이 필요하지 않습니다.
191 -- 코드 생성기를 사용할 필요가 없스빈다. 191 +- 코드 생성기를 사용할 필요가 없습니다.
192 192
193 Get의 반응형 프로그램은 setState를 사용하는 것 만큼 쉽습니다. 193 Get의 반응형 프로그램은 setState를 사용하는 것 만큼 쉽습니다.
194 194
@@ -216,7 +216,7 @@ Obx(() => Text("${controller.name}")); @@ -216,7 +216,7 @@ Obx(() => Text("${controller.name}"));
216 216
217 ### 상태 관리에 대한 자세한 내용 217 ### 상태 관리에 대한 자세한 내용
218 218
219 -**상태 관리에 대한 자세한 설명은 [여기](./documentation/en_US/state_management.md)를 보십시오. 여기에서 더 많은 예제와 단순 상태 관리자와 반응형 상태 관리자의 차이점을 볼 수 있습니다.** 219 +**상태 관리에 대한 자세한 설명은 [여기](./documentation/kr_KO/state_management.md)를 보십시오. 여기에서 더 많은 예제와 단순 상태 관리자와 반응형 상태 관리자의 차이점을 볼 수 있습니다.**
220 220
221 GetX 능력에 대한 좋은 아이디어를 얻을 수 있습니다. 221 GetX 능력에 대한 좋은 아이디어를 얻을 수 있습니다.
222 222
@@ -969,7 +969,7 @@ class SettingsService extends GetxService { @@ -969,7 +969,7 @@ class SettingsService extends GetxService {
969 969
970 1- Rx 타입들: 970 1- Rx 타입들:
971 971
972 -| 이전 | 이후 | 972 +| 이전 | 이후 |
973 | ------- | ---------- | 973 | ------- | ---------- |
974 | StringX | `RxString` | 974 | StringX | `RxString` |
975 | IntX | `RxInt` | 975 | IntX | `RxInt` |
1 ![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) 1 ![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png)
2 2
3 -**Languages: English (this file), [Indonesian](README.id-ID.md), [Urdu](README.ur-PK.md), [Chinese](README.zh-cn.md), [Brazilian Portuguese](README.pt-br.md), [Spanish](README-es.md), [Russian](README.ru.md), [Polish](README.pl.md), [Korean](README.ko-kr.md).** 3 +**Languages: English (this file), [Indonesian](README.id-ID.md), [Urdu](README.ur-PK.md), [Chinese](README.zh-cn.md), [Brazilian Portuguese](README.pt-br.md), [Spanish](README-es.md), [Russian](README.ru.md), [Polish](README.pl.md), [Korean](README.ko-kr.md), [French](README-fr.md).**
4 4
5 [![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get) 5 [![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get)
6 [![likes](https://badges.bar/get/likes)](https://pub.dev/packages/get/score) 6 [![likes](https://badges.bar/get/likes)](https://pub.dev/packages/get/score)
@@ -119,7 +119,7 @@ void main() => runApp(GetMaterialApp(home: Home())); @@ -119,7 +119,7 @@ void main() => runApp(GetMaterialApp(home: Home()));
119 ``` 119 ```
120 120
121 - Note: this does not modify the MaterialApp of the Flutter, GetMaterialApp is not a modified MaterialApp, it is just a pre-configured Widget, which has the default MaterialApp as a child. You can configure this manually, but it is definitely not necessary. GetMaterialApp will create routes, inject them, inject translations, inject everything you need for route navigation. If you use Get only for state management or dependency management, it is not necessary to use GetMaterialApp. GetMaterialApp is necessary for routes, snackbars, internationalization, bottomSheets, dialogs, and high-level apis related to routes and absence of context. 121 - Note: this does not modify the MaterialApp of the Flutter, GetMaterialApp is not a modified MaterialApp, it is just a pre-configured Widget, which has the default MaterialApp as a child. You can configure this manually, but it is definitely not necessary. GetMaterialApp will create routes, inject them, inject translations, inject everything you need for route navigation. If you use Get only for state management or dependency management, it is not necessary to use GetMaterialApp. GetMaterialApp is necessary for routes, snackbars, internationalization, bottomSheets, dialogs, and high-level apis related to routes and absence of context.
122 -- Note²: This step in only necessary if you gonna use route management (`Get.to()`, `Get.back()` and so on). If you not gonna use it then it is not necessary to do step 1 122 +- Note²: This step is only necessary if you gonna use route management (`Get.to()`, `Get.back()` and so on). If you not gonna use it then it is not necessary to do step 1
123 123
124 - Step 2: 124 - Step 2:
125 Create your business logic class and place all variables, methods and controllers inside it. 125 Create your business logic class and place all variables, methods and controllers inside it.
@@ -149,7 +149,7 @@ class Home extends StatelessWidget { @@ -149,7 +149,7 @@ class Home extends StatelessWidget {
149 appBar: AppBar(title: Obx(() => Text("Clicks: ${c.count}"))), 149 appBar: AppBar(title: Obx(() => Text("Clicks: ${c.count}"))),
150 150
151 // Replace the 8 lines Navigator.push by a simple Get.to(). You don't need context 151 // Replace the 8 lines Navigator.push by a simple Get.to(). You don't need context
152 - body: Center(child: RaisedButton( 152 + body: Center(child: ElevatedButton(
153 child: Text("Go to Other"), onPressed: () => Get.to(Other()))), 153 child: Text("Go to Other"), onPressed: () => Get.to(Other()))),
154 floatingActionButton: 154 floatingActionButton:
155 FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment)); 155 FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment));
@@ -210,7 +210,7 @@ To make it observable, you just need to add ".obs" to the end of it: @@ -210,7 +210,7 @@ To make it observable, you just need to add ".obs" to the end of it:
210 var name = 'Jonatas Borges'.obs; 210 var name = 'Jonatas Borges'.obs;
211 ``` 211 ```
212 212
213 -And in the UI, when you want to show that value and update the screen whenever tha values changes, simply do this: 213 +And in the UI, when you want to show that value and update the screen whenever the values changes, simply do this:
214 214
215 ```dart 215 ```dart
216 Obx(() => Text("${controller.name}")); 216 Obx(() => Text("${controller.name}"));
@@ -916,6 +916,55 @@ user.update((value){ @@ -916,6 +916,55 @@ user.update((value){
916 916
917 print( user ); 917 print( user );
918 ``` 918 ```
  919 +## StateMixin
  920 +
  921 +Another way to handle your `UI` state is use the `StateMixin<T>` .
  922 +To implement it, use the `with` to add the `StateMixin<T>`
  923 +to your controller which allows a T model.
  924 +
  925 +``` dart
  926 +class Controller extends GetController with StateMixin<User>{}
  927 +```
  928 +
  929 +The `change()` method change the State whenever we want.
  930 +Just pass the data and the status in this way:
  931 +
  932 +```dart
  933 +change(data, status: RxStatus.success());
  934 +```
  935 +
  936 +RxStatus allow these status:
  937 +
  938 +``` dart
  939 +RxStatus.loading();
  940 +RxStatus.success();
  941 +RxStatus.empty();
  942 +RxStatus.error('message');
  943 +```
  944 +
  945 +To represent it in the UI, use:
  946 +
  947 +```dart
  948 +class OtherClass extends GetView<Controller> {
  949 + @override
  950 + Widget build(BuildContext context) {
  951 + return Scaffold(
  952 +
  953 + body: controller.obx(
  954 + (state)=>Text(state.name),
  955 +
  956 + // here you can put your custom loading indicator, but
  957 + // by default would be Center(child:CircularProgressIndicator())
  958 + onLoading: CustomLoadingIndicator(),
  959 + onEmpty: Text('No data found'),
  960 +
  961 + // here also you can set your own error widget, but by
  962 + // default will be an Center(child:Text(error))
  963 + onError: (error)=>Text(error),
  964 + ),
  965 + );
  966 +}
  967 +```
919 968
920 #### GetView 969 #### GetView
921 970
@@ -924,7 +973,7 @@ I love this Widget, is so simple, yet, so useful! @@ -924,7 +973,7 @@ I love this Widget, is so simple, yet, so useful!
924 Is a `const Stateless` Widget that has a getter `controller` for a registered `Controller`, that's all. 973 Is a `const Stateless` Widget that has a getter `controller` for a registered `Controller`, that's all.
925 974
926 ```dart 975 ```dart
927 - class AwesomeController extends GetxController { 976 + class AwesomeController extends GetController {
928 final String title = 'My Awesome View'; 977 final String title = 'My Awesome View';
929 } 978 }
930 979
@@ -1120,6 +1169,7 @@ Any contribution is welcome! @@ -1120,6 +1169,7 @@ Any contribution is welcome!
1120 1169
1121 ## Articles and videos 1170 ## Articles and videos
1122 1171
  1172 +- [Flutter Getx EcoSystem package for arabic people](https://www.youtube.com/playlist?list=PLV1fXIAyjeuZ6M8m56zajMUwu4uE3-SL0) - Tutorial by [Pesa Coder](https://github.com/UsamaElgendy).
1123 - [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). 1173 - [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).
1124 - [Complete GetX™ Navigation](https://www.youtube.com/watch?v=RaqPIoJSTtI) - Route management video by Amateur Coder. 1174 - [Complete GetX™ Navigation](https://www.youtube.com/watch?v=RaqPIoJSTtI) - Route management video by Amateur Coder.
1125 - [Complete GetX State Management](https://www.youtube.com/watch?v=CNpXbeI_slw) - State management video by Amateur Coder. 1175 - [Complete GetX State Management](https://www.youtube.com/watch?v=CNpXbeI_slw) - State management video by Amateur Coder.
@@ -1133,3 +1183,4 @@ Any contribution is welcome! @@ -1133,3 +1183,4 @@ Any contribution is welcome!
1133 - [GetX Flutter Firebase Auth Example](https://medium.com/@jeffmcmorris/getx-flutter-firebase-auth-example-b383c1dd1de2) - Article by Jeff McMorris. 1183 - [GetX Flutter Firebase Auth Example](https://medium.com/@jeffmcmorris/getx-flutter-firebase-auth-example-b383c1dd1de2) - Article by Jeff McMorris.
1134 - [Flutter State Management with GetX – Complete App](https://www.appwithflutter.com/flutter-state-management-with-getx/) - by App With Flutter. 1184 - [Flutter State Management with GetX – Complete App](https://www.appwithflutter.com/flutter-state-management-with-getx/) - by App With Flutter.
1135 - [Flutter Routing with Animation using Get Package](https://www.appwithflutter.com/flutter-routing-using-get-package/) - by App With Flutter. 1185 - [Flutter Routing with Animation using Get Package](https://www.appwithflutter.com/flutter-routing-using-get-package/) - by App With Flutter.
  1186 +- [A minimal example on dartpad](https://dartpad.dev/2b3d0d6f9d4e312c5fdbefc414c1727e?) - by [Roi Peker](https://github.com/roipeker)
1 ![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) 1 ![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png)
2 2
3 -*Languages: [English](README.md), [Indonezyjski](README.id-ID.md), [Urdu](README.ur-PK.md), [Język chiński](README.zh-cn.md), [Brazilian Portuguese](README.pt-br.md), [Spanish](README-es.md), [Russian](README.ru.md), Polish (Jesteś tu), [Koreański](README.ko-kr.md).* 3 +*Languages: [English](README.md), [Indonezyjski](README.id-ID.md), [Urdu](README.ur-PK.md), [Język chiński](README.zh-cn.md), [Brazilian Portuguese](README.pt-br.md), [Spanish](README-es.md), [Russian](README.ru.md), Polish (Jesteś tu), [Koreański](README.ko-kr.md), [French](README-fr.md)*
4 4
5 [![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get) 5 [![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get)
6 ![building](https://github.com/jonataslaw/get/workflows/build/badge.svg) 6 ![building](https://github.com/jonataslaw/get/workflows/build/badge.svg)
@@ -48,14 +48,14 @@ @@ -48,14 +48,14 @@
48 [**Telegram (Portuguese)**](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) 48 [**Telegram (Portuguese)**](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g)
49 49
50 # Wprowadzenie 50 # Wprowadzenie
51 -- GetX jest bardzo lekką i potężną biblioteką do Flattera. Łączy wysoką wydajność menadżera stanu, inteligętne dodawanie dependencies i zarządzanie routami w szybki i praktyczny sposób. 51 +- GetX jest bardzo lekką, a zarazem potężną biblioteką do Flattera. Łączy wysoką wydajność menadżera stanu, inteligętne dodawanie dependencies i zarządzanie routami w szybki i praktyczny sposób.
52 - GetX nie jest dla wszystkich, skupia się na jak najmniejszej konsumpcji zasobów (wydajności) ([zobacz benchmarki](https://github.com/jonataslaw/benchmarks)), używaniu łatwej skłani (produktywności) i daniu możliwości pełnego rozbicia View na z logiki biznesowej (organizacja). 52 - GetX nie jest dla wszystkich, skupia się na jak najmniejszej konsumpcji zasobów (wydajności) ([zobacz benchmarki](https://github.com/jonataslaw/benchmarks)), używaniu łatwej skłani (produktywności) i daniu możliwości pełnego rozbicia View na z logiki biznesowej (organizacja).
53 -- GetX która da Ci supermoce i zwiększy produktywność w tworzeniu projektu. Oszczędzi godziny zarówno początkującym jak i ekspoertom. 53 +- GetX da Ci supermoce i zwiększy produktywność w tworzeniu projektu. Oszczędzi godziny zarówno początkującym jak i ekspertom.
54 - Nawiguj bez podawania `context`, używaj open `dialogs`, `snackbarów` oraz `bottomsheetów` z każdego miejsca w kodzie. Zarządzaj stanami i dodawaj dependencies w prosty i praktyczny sposób! 54 - Nawiguj bez podawania `context`, używaj open `dialogs`, `snackbarów` oraz `bottomsheetów` z każdego miejsca w kodzie. Zarządzaj stanami i dodawaj dependencies w prosty i praktyczny sposób!
55 - Get jest bezpieczny, stabilny i aktualny. Oprócz tego oferuje szeroki zakres API, które nie są zawarte w standardowym frameworku. 55 - Get jest bezpieczny, stabilny i aktualny. Oprócz tego oferuje szeroki zakres API, które nie są zawarte w standardowym frameworku.
56 -- GetX nie jest przytłaczający. Ma wiele funkcjonalności pozwalajacych na rozpoczęcie programowania bez martwienia się o nic, ale wszystkie te funkcjonalności są w osobnych kontenerach będących dodane dopiero po ich użyciu. Jeśli tylko używasz menadżera stanu, tylko on będzie kompilowany. Jeśli używasz routów, lecz nic z menadżera stanu on nie będzie kompilowany. Możesz skompilować repozytorium benchmark i zobaczysz że używa tylko menadżera stanu. Aplikacje używajace Get są mniejsze niz inne ponieważ wszystkie rozwiązania GetX sa projektowane dla lekkości i wydajności. Jest to też zasługa Flutterowego AOT, które jest niesamowite i eliminuje nieużywane zasoby jak żaden inny framework. 56 +- GetX nie jest przytłaczający. Ma wiele funkcjonalności pozwalajacych na rozpoczęcie programowania bez martwienia się zupełnie nic. Wszystkie funkcjonalności są w osobnych kontenerach, które dodawane są dopiero po ich użyciu. Jeśli tylko używasz menadżera stanu, tylko on będzie kompilowany. Jeśli używasz routów, lecz nic z menadżera stanu to nie będzie on kompilowany. Możesz skompilować repozytorium benchmark i zobaczysz że używa tylko menadżera stanu. Aplikacje używajace Get są mniejsze niz inne, ponieważ wszystkie rozwiązania GetX są projektowane z myślą o lekkości i wydajności. Jest to też zasługa Flutterowego AOT, które jest niesamowite i eliminuje nieużywane zasoby jak żaden inny framework.
57 57
58 -**GetX zwiększa stwoja produktywność, lecz mozesz to jeszcze przyspieszyć instalując rozszerzenie [GetX extension](https://marketplace.visualstudio.com/items?itemName=get-snippets.get-snippets) do swojego VSCode**. Jeszcze nie dostępne w innych IDE. 58 +**GetX zwiększa twoja produktywność, lecz możesz to jeszcze przyspieszyć instalując rozszerzenie [GetX extension](https://marketplace.visualstudio.com/items?itemName=get-snippets.get-snippets) do swojego VSCode**. Jeszcze nie dostępne w innych IDE.
59 59
60 # Instalacja 60 # Instalacja
61 61
@@ -74,7 +74,7 @@ import 'package:get/get.dart'; @@ -74,7 +74,7 @@ import 'package:get/get.dart';
74 74
75 # Counter App z GetX 75 # Counter App z GetX
76 76
77 -Przykładowa aplikaja tworzona domyślnie podczas kreacji nowego projektu we Flaterze ma ponad 100 lini kodu (z komentarzami). By pokazać siłę Get pokarzę jak zrobić "licznik" ze zmienianą stan z każdym kliknięciem, zmianą stron i udostępniajac stan pomiędzy ekranami. Wszystko w zorganizowany sposób dzieląc buissnes logic z view w zaledwie 26 LINI KODU WŁĄCZAJĄC W TO KOMENTARZE. 77 +Przykładowa aplikaja tworzona domyślnie podczas kreacji nowego projektu we Flaterze ma ponad 100 lini kodu (z komentarzami). By pokazać siłę Get pokażę jak zrobić "licznik" ze zmianą stanu przy każdym kliknięciu, zmianą stron i udostępniajac stan pomiędzy ekranami. Wszystko w zorganizowany sposób dzieląc bussines logic z view w zaledwie 26 LINI KODU WŁĄCZAJĄC W TO KOMENTARZE.
78 78
79 -Krok 1: 79 -Krok 1:
80 Dodaj "Get" przed MaterialApp, zamieniając je na GetMaterialApp 80 Dodaj "Get" przed MaterialApp, zamieniając je na GetMaterialApp
@@ -84,10 +84,10 @@ Dodaj "Get" przed MaterialApp, zamieniając je na GetMaterialApp @@ -84,10 +84,10 @@ Dodaj "Get" przed MaterialApp, zamieniając je na GetMaterialApp
84 void main() => runApp(GetMaterialApp(home: Home())); 84 void main() => runApp(GetMaterialApp(home: Home()));
85 ``` 85 ```
86 86
87 -- Note: nie jest to modyfikaja MaterialApp, ponieważ GetMaterialApp nie jest zmodyfikowanym MaterialApp z Fluttera, jest tylko zkonfigurowanym Widgetem mającym domyślnie MaterialApp jako dziecko. Możesz to konfigurować ręcznie, ale nie jest to konieczne. GetMaterialApp jest niezbędne dla działania routów, snackbarów, bootomsheetów, internacjonalizacji, dialogów i wysokopoziomowych api powiązanych z routami i nieobecnościa kontekstu. Nie jest to jednak wymagane do używania zarzadzania stanem i dependencies. 87 +- Note: nie jest to modyfikaja MaterialApp, ponieważ GetMaterialApp nie jest zmodyfikowanym MaterialApp z Fluttera, jest tylko skonfigurowanym Widgetem mającym domyślnie MaterialApp jako dziecko. Możesz to konfigurować ręcznie, ale nie jest to konieczne. GetMaterialApp jest niezbędne dla działania routów, snackbarów, bootomsheetów, internacjonalizacji, dialogów i wysokopoziomowych api powiązanych z routami i nieobecnościa kontekstu. Nie jest to jednak wymagane do używania zarzadzania stanem i dependencies.
88 88
89 -Krok 2: 89 -Krok 2:
90 -Tworzymy klasę business logic i umieszczmy w niej wszystkie zmienne, metody oraz kontrolery. Możesz zmienić zmienna=ą na obserwowalną używajac prostego ".obs" 90 +Tworzymy klasę business logic i umieszczmy w niej wszystkie zmienne, metody oraz kontrolery. Możesz zmienić zmiennaą na obserwowalną używajac prostego subfixu ".obs"
91 91
92 ```dart 92 ```dart
93 class Controller extends GetxController{ 93 class Controller extends GetxController{
@@ -113,7 +113,7 @@ class Home extends StatelessWidget { @@ -113,7 +113,7 @@ class Home extends StatelessWidget {
113 appBar: AppBar(title: Obx(() => Text("Clicks: " + c.count.string))), 113 appBar: AppBar(title: Obx(() => Text("Clicks: " + c.count.string))),
114 114
115 // Replace the 8 lines Navigator.push by a simple Get.to(). You don't need context 115 // Replace the 8 lines Navigator.push by a simple Get.to(). You don't need context
116 - body: Center(child: RaisedButton( 116 + body: Center(child: ElevatedButton(
117 child: Text("Go to Other"), onPressed: () => Get.to(Other()))), 117 child: Text("Go to Other"), onPressed: () => Get.to(Other()))),
118 floatingActionButton: 118 floatingActionButton:
119 FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment)); 119 FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment));
@@ -135,11 +135,11 @@ Wynik: @@ -135,11 +135,11 @@ Wynik:
135 135
136 ![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/counter-app-gif.gif) 136 ![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/counter-app-gif.gif)
137 137
138 -Jest to prosty projekt, ale już na jego przykładzie widać potęgę Get. Wzraz ze wzrostem rozmiaru aplikacji ta różnica tylko się powieksza. 138 +Jest to prosty projekt, ale już na jego przykładzie widać potęgę Get. Wraz ze wzrostem rozmiaru aplikacji ta różnica tylko się powiększa.
139 139
140 -Get był projektowany dla pracy z zespołem, ale równie dobrze sprawdza się w indywidualnej pracy. 140 +Get był projektowany dla pracy z zespołem, ale równie dobrze sprawdza się w indywidualnych projektach.
141 141
142 -Zawsze dotrzymuj deadlinów i dostarczaj swoje rozwiązania na czas bez straty na wydajności. Get nie jest dla wszystkich jak już wspominałem, ale jeśli identyfikujesz się z powyższym zdaniem Get jest dla ciebie. 142 +Zawsze dotrzymuj deadlinów i dostarczaj swoje rozwiązania na czas bez straty na wydajności. Get nie jest dla wszystkich jak już wspominałem, ale jeśli identyfikujesz się z powyższym zdaniem Get jest właśnie dla Ciebie.
143 143
144 # Trzy filary 144 # Trzy filary
145 145
@@ -151,15 +151,15 @@ Get nie jest ani lepszy, ani gorszy od innych menadżerów stanów, ale powinien @@ -151,15 +151,15 @@ Get nie jest ani lepszy, ani gorszy od innych menadżerów stanów, ale powinien
151 151
152 Definitywnie Get nie jest przeciwnikiem żadnego innego menadżera, ponieważ jest on mikroframeworkiem, nie tylko menadżerem stanu. Może być użyty samodzielnie, lub w koegzystencji. 152 Definitywnie Get nie jest przeciwnikiem żadnego innego menadżera, ponieważ jest on mikroframeworkiem, nie tylko menadżerem stanu. Może być użyty samodzielnie, lub w koegzystencji.
153 153
154 -Get ma bardzo lekki i prosty menadżer stanu (napisany w tylko 95 lini kodu), który nie używa ChangeNotifier. Sprosta on wymaganiom szczególnie nowych we Flutterze i nie sprawi problemu nawer w dużych aplikacjach. 154 +Get ma bardzo lekki i prosty menadżer stanu (napisany w tylko 95 lini kodu), który nie używa ChangeNotifier. Sprosta on wymaganiom szczególnie nowych we Flutterze i nie sprawi problemu nawet w dużych aplikacjach.
155 155
156 ### Reaktywny menadżer stanu 156 ### Reaktywny menadżer stanu
157 157
158 -Reaktywne programowanie możee dotrącać niektórych, ponieważ powszechnie jest uważane za skomplikowane. GetX zamienia to w coś prostego: 158 +Reaktywne programowanie może odtrącać niektórych, ponieważ powszechnie jest uważane za skomplikowane. GetX zamienia to w coś prostego:
159 159
160 -- Nie musisz tworzyć Strw=eamControllerów, 160 +- Nie musisz tworzyć StreamControllerów,
161 - Nie musisz tworzyć StreamBuildera dla każdej zmiennej, 161 - Nie musisz tworzyć StreamBuildera dla każdej zmiennej,
162 -- Nie ma potrzeby tworzenia klasy dla kżdego stanu, 162 +- Nie ma potrzeby tworzenia klasy dla każdego stanu,
163 - Nie musisz tworzyć Get dla inicjalnej zmiennej 163 - Nie musisz tworzyć Get dla inicjalnej zmiennej
164 164
165 Wyobraź sobie, że masz zmienną i za każdym razem jak zmienisz ją chcesz żeby wszystkie widżety używające jej automatycznie się zmieniły 165 Wyobraź sobie, że masz zmienną i za każdym razem jak zmienisz ją chcesz żeby wszystkie widżety używające jej automatycznie się zmieniły
@@ -183,11 +183,11 @@ Obx (() => Text (controller.name)); @@ -183,11 +183,11 @@ Obx (() => Text (controller.name));
183 To wszystko. *Proste*, co nie? 183 To wszystko. *Proste*, co nie?
184 184
185 ### Bardziej szczegółowo o menadżerze stanu 185 ### Bardziej szczegółowo o menadżerze stanu
186 -**Zobacz bardziej szczegółowe wytłumaczenie menadz=żera sranu [tutaj](./documentation/en_US/state_management.md). Znajdują się tam przykłady jak o różnice między prostym menadżerem stanu oraz reaktywnym** 186 +**Zobacz bardziej szczegółowe wytłumaczenie menadżera stanu [tutaj](./documentation/en_US/state_management.md). Znajdują się tam przykłady jak o różnice między prostym menadżerem stanu oraz reaktywnym**
187 187
188 ### Video tłumaczące użycie menadżera stanu 188 ### Video tłumaczące użycie menadżera stanu
189 189
190 -Amateur COder nagrał o tym niezwykły film: 190 +Tadas Petra nagrał o tym niezwykły film:
191 191
192 Link: [Complete GetX State Management](https://www.youtube.com/watch?v=CNpXbeI_slw) 192 Link: [Complete GetX State Management](https://www.youtube.com/watch?v=CNpXbeI_slw)
193 193
@@ -239,42 +239,42 @@ I użyj następujące np.: @@ -239,42 +239,42 @@ I użyj następujące np.:
239 ```dart 239 ```dart
240 if(data == 'sucess') madeAnything(); 240 if(data == 'sucess') madeAnything();
241 ``` 241 ```
242 -Zobacz, ze do żadnej z tych operacji nie potrzebowałeś contextu. Jest to jedna z głównych zalet GetX oszczędzającego na niepotrzebnej ogudowie z kod i dającego możliwość uzywania tych metod w klasie kontrolera. 242 +Zobacz, ze do żadnej z tych operacji nie potrzebowałeś contextu. Jest to jedna z głównych zalet GetX oszczędzającego na niepotrzebnej obudowie w kod i dającego możliwość używania tych metod w klasie kontrolera.
243 243
244 244
245 ### Więcej o routach 245 ### Więcej o routach
246 246
247 -**Get używa named routes i także oferuje niskopoziomową obsługę routów! Zobacz bardziej szczegółową dokumentacje [tutaj](./documentation/en_US/route_management.md)** 247 +**Get używa named routes oraz oferuje niskopoziomową obsługę routów! Zobacz bardziej szczegółową dokumentacje [tutaj](./documentation/en_US/route_management.md)**
248 248
249 ### Video tłumaczące użycie 249 ### Video tłumaczące użycie
250 250
251 -Amateur Coder nagrał o tym niezwykły film: 251 +Tadas Petra nagrał o tym niezwykły film:
252 252
253 Link: [Complete GetX Navigation](https://www.youtube.com/watch?v=RaqPIoJSTtI) 253 Link: [Complete GetX Navigation](https://www.youtube.com/watch?v=RaqPIoJSTtI)
254 254
255 ## Zarządzanie dependencies 255 ## Zarządzanie dependencies
256 256
257 -Get ma prosty i potężny menadżer dependencies. Pozwala on na otrzymanie tych samych klas jak twoje Bloc lub Kontroler piszac jedną linię kodu bez Provider context i inheritedWidget: 257 +Get ma prosty, a zarazem potężny menadżer dependencies. Pozwala on na otrzymanie tych samych klas jak twoje Bloc lub Kontroler pisząc jedną linię kodu bez Provider context i inheritedWidget:
258 258
259 ```dart 259 ```dart
260 Controller controller = Get.put(Controller()); // Rather Controller controller = Controller(); 260 Controller controller = Get.put(Controller()); // Rather Controller controller = Controller();
261 ``` 261 ```
262 262
263 -- Note: Jeśli używasz menadżera stanu Get zwróć uwafę na binding api, które pozwoli Ci łatwiej połączyć twój widok z kontrolerem. 263 +- Note: Jeśli używasz menadżera stanu Get zwróć uwagę na binding api, które pozwoli Ci łatwiej połączyć twój widok z kontrolerem.
264 https://github.com/jonataslaw/get 264 https://github.com/jonataslaw/get
265 -**Tip:** Menadżer dependency Get jest oddzielony od innych części pakietu więc jeśli już używasz menadzera stanu(którego kolwiek,bez różnicy) nie musisz przepisywać tego wszystkiego na nowo. Możesz używać tego dodawania dependencies bez poroblemu. 265 +**Tip:** Menadżer dependency Get jest oddzielony od innych części pakietu więc jeśli już używasz menadżera stanu(którego kolwiek, bez różnicy) nie musisz przepisywać tego wszystkiego na nowo. Możesz używać tego dodawania dependencies bez poroblemu.
266 266
267 ```dart 267 ```dart
268 controller.fetchApi(); 268 controller.fetchApi();
269 ``` 269 ```
270 -Wyobraź sobie, że musisz nawigować pomiędzy wieloma routami i potrzebujesz dane z kontrolerów z poprzednich ekranów. Musiałbyś użyć menadżera stanu z dodatkiem Providera albo Get_it, prawda? Otuż nie z Fet. Muszisz po prostu poprosić Get o znalezienie tego kontrolera i nie potrzebujesz przy tym dodatkowych dependencies. 270 +Wyobraź sobie, że musisz nawigować pomiędzy wieloma routami i potrzebujesz dane z kontrolerów z poprzednich ekranów. Musiałbyś użyć menadżera stanu z dodatkiem Providera albo Get_it, prawda? Otóż nie z Fet. Musisz po prostu poprosić Get o znalezienie tego kontrolera i nie potrzebujesz przy tym dodatkowych dependencies.
271 271
272 ```dart 272 ```dart
273 Controller controller = Get.find(); 273 Controller controller = Get.find();
274 -//Yes, it looks like Magic, Get will find your controller, and will deliver it to you. You can have 1 million controllersfeatury instantiated, Get will always give you the right controller. 274 +//Tak, to wygląda jak Magia, Get znjadzie Twój kontroler i Ci go dostarczy. Możesz mieć nawet MILION kontrolerów, a Get zawsze da Ci prawidłowy kontroler.
275 ``` 275 ```
276 276
277 -I wtedy będziesz mógł otrzymać bez problemu z niego dane 277 +I wtedy będziesz mógł otrzymać z niego dane bez żadnego problemu
278 278
279 ```dart 279 ```dart
280 Text(controller.textFromApi); 280 Text(controller.textFromApi);
@@ -287,8 +287,8 @@ Text(controller.textFromApi); @@ -287,8 +287,8 @@ Text(controller.textFromApi);
287 287
288 Możesz uczestniczyć w rozwoju projektu na różny sposób: 288 Możesz uczestniczyć w rozwoju projektu na różny sposób:
289 - Pomagając w tłumaczeniu readme na inne języki. 289 - Pomagając w tłumaczeniu readme na inne języki.
290 -- Dodając dokumentację do readme ( nawet nie połowa funkcji została jeszcze opisana).  
291 -- Pisząc artykuły i nagrywając filmy uczące użycia biblioteki Get (będą zamieszczone w readme, a w przyszłości na naszej Wiki). 290 +- Dodając dokumentację do readme (nawet połowa funkcji została jeszcze opisana).
  291 +- Pisząc artykuły i nagrywając filmy pokazujące użycie biblioteki Get (będą zamieszczone w readme, a w przyszłości na naszej Wiki).
292 - Oferując PR-y dla kodu i testów. 292 - Oferując PR-y dla kodu i testów.
293 - Dodając nowe funkcje. 293 - Dodając nowe funkcje.
294 294
@@ -298,7 +298,7 @@ Każda współpraca jest mile widziana! @@ -298,7 +298,7 @@ Każda współpraca jest mile widziana!
298 298
299 ## Zmiana motywu 299 ## Zmiana motywu
300 300
301 -Nie powinno się uzywać innego widżetu niż GetMaterialApp by go zaktualizować. To może powodować duplikacje kluczy. Wiele osób nawykło do prehistorycznego podejścia tworzenia widżetu "ThemeProvider" tylko po to by zmienić motyw aplikacji. Z Get nie jest to absolutnie wymagane. 301 +Nie powinno się używać innego widżetu niż GetMaterialApp by go zaktualizować. To może powodować duplikacje kluczy. Wiele osób nawykło do prehistorycznego podejścia tworzenia widżetu "ThemeProvider" tylko po to by zmienić motyw aplikacji. Z Get nie jest to wymagane.
302 302
303 Możesz stworzyć customowy motyw i łatwo go dodać z Get.changeTheme bez niepotrzebnego kodu. 303 Możesz stworzyć customowy motyw i łatwo go dodać z Get.changeTheme bez niepotrzebnego kodu.
304 304
@@ -314,7 +314,7 @@ Get.changeTheme(Get.isDarkMode? ThemeData.light(): ThemeData.dark());featury @@ -314,7 +314,7 @@ Get.changeTheme(Get.isDarkMode? ThemeData.light(): ThemeData.dark());featury
314 314
315 Kiedy ciemny motyw jest aktywny zmieni się on na jasny, w przeciwnym wypadku zmieni się na ciemny. 315 Kiedy ciemny motyw jest aktywny zmieni się on na jasny, w przeciwnym wypadku zmieni się na ciemny.
316 316
317 -Jeśli interesuje Cię jak zmieniać motywy podąrzaj za samouczkiem na Medium uczącym zmiany motywu z Get: 317 +Jeśli interesuje Cię jak zmieniać motywy podążaj za samouczkiem na Medium pokazującum zmianę motywu przy użyciu Get:
318 318
319 - [Dynamic Themes in 3 lines using Get](https://medium.com/swlh/flutter-dynamic-themes-in-3-lines-c3b375f292e3) - Samouczek stworzony przez [Rod Brown](https://github.com/RodBr). 319 - [Dynamic Themes in 3 lines using Get](https://medium.com/swlh/flutter-dynamic-themes-in-3-lines-c3b375f292e3) - Samouczek stworzony przez [Rod Brown](https://github.com/RodBr).
320 320
@@ -486,7 +486,7 @@ GetMaterialApp( @@ -486,7 +486,7 @@ GetMaterialApp(
486 ## Video tłumaczące inne funkcjonalności GetX 486 ## Video tłumaczące inne funkcjonalności GetX
487 487
488 488
489 -Amateur Coder nagrał niezwykły film tłumaczący powyższe zagadnienia! 489 +Tadas Petra nagrał niezwykły film tłumaczący powyższe zagadnienia!
490 490
491 Link: [GetX Other Features](https://youtu.be/ttQtlX_Q0eU) 491 Link: [GetX Other Features](https://youtu.be/ttQtlX_Q0eU)
492 492
@@ -504,7 +504,7 @@ Link: [GetX Other Features](https://youtu.be/ttQtlX_Q0eU) @@ -504,7 +504,7 @@ Link: [GetX Other Features](https://youtu.be/ttQtlX_Q0eU)
504 | NumX | `RxNum` | 504 | NumX | `RxNum` |
505 | DoubleX | `RxDouble` | 505 | DoubleX | `RxDouble` |
506 506
507 -RXController i GetBuilder teraz zostały połączone. Nie musisz już pamiętać którego kontrolerachcesz użyć, po prostu korzystaj z GetxController, będzie działać zarówno dla prostego jak i reaktywnego menadżera stanów. 507 +RXController i GetBuilder teraz zostały połączone. Nie musisz już pamiętać którego kontrolera chcesz użyć, po prostu korzystaj z GetxController, będzie działać zarówno dla prostego jak i reaktywnego menadżera stanów.
508 508
509 2- NamedRoutes 509 2- NamedRoutes
510 Wcześniej: 510 Wcześniej:
@@ -528,7 +528,7 @@ GetMaterialApp( @@ -528,7 +528,7 @@ GetMaterialApp(
528 ``` 528 ```
529 529
530 Po co ta zmiana? 530 Po co ta zmiana?
531 -Często może być niezbędnym decydowanie która strona będzie wyswietlana w zależności od parametru, lub tokenu logowania. Wczesniejsze podejscie było nieelastyczne nie pozwalając na to. Zawarcie strony w funkcji zmniejszyło sporzycie RAM-u, ze względu na niealokowanie routów od początku działania aplikacji. Pozwoliło to także na takie podejscie: 531 +Często może być niezbędnym decydowanie która strona będzie wyświetlana w zależności od parametru, lub tokenu logowania. Wczesniejsze podejście było nieelastyczne, ponieważ na to nie pozwalało. Zawarcie strony w funkcji zmniejszyło sporzycie RAM-u, ze względu na niealokowanie routów od początku działania aplikacji. Pozwoliło to także na takie podejscie:
532 532
533 ```dart 533 ```dart
534 534
1 ![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) 1 ![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png)
2 2
3 -**Idiomas: [Inglês](README.md), [Indonésia](README.id-ID.md), [Urdu](README.ur-PK.md), [Chinês](README.zh-cn.md), Português Brasileiro (este arquivo), [Espanhol](README-es.md), [Russo](README.ru.md), [Polonês](README.pl.md), [Coreana](README.ko-kr.md).** 3 +**Idiomas: [Inglês](README.md), [Indonésia](README.id-ID.md), [Urdu](README.ur-PK.md), [Chinês](README.zh-cn.md), Português (este arquivo), [Espanhol](README-es.md), [Russo](README.ru.md), [Polonês](README.pl.md), [Coreano](README.ko-kr.md), [Francês](README-fr.md)**
4 4
5 [![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get) 5 [![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get)
6 [![likes](https://badges.bar/get/likes)](https://pub.dev/packages/get/score) 6 [![likes](https://badges.bar/get/likes)](https://pub.dev/packages/get/score)
@@ -158,7 +158,7 @@ class Home extends StatelessWidget { @@ -158,7 +158,7 @@ class Home extends StatelessWidget {
158 appBar: AppBar(title: Obx(() => Text("Total de cliques: ${c.count}"))), 158 appBar: AppBar(title: Obx(() => Text("Total de cliques: ${c.count}"))),
159 159
160 // Troque o Navigator.push de 8 linhas por um simples Get.to(). Você não precisa do 'context' 160 // Troque o Navigator.push de 8 linhas por um simples Get.to(). Você não precisa do 'context'
161 - body: Center(child: RaisedButton( 161 + body: Center(child: ElevatedButton(
162 child: Text("Ir pra Outra tela"), onPressed: () => Get.to(Outra()))), 162 child: Text("Ir pra Outra tela"), onPressed: () => Get.to(Outra()))),
163 floatingActionButton: 163 floatingActionButton:
164 FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment)); 164 FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment));
1 ![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) 1 ![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png)
2 2
3 -_Языки: Русский (этот файл), [индонезийский](README.id-ID.md), [урду](README.ur-PK.md), [Английский](README.md), [Китайский](README.zh-cn.md), [Бразильский Португальский](README.pt-br.md), [Испанский](README-es.md), [Польский](README.pl.md), [Kорейский](README.ko-kr.md)._ 3 +_Языки: Русский (этот файл), [индонезийский](README.id-ID.md), [урду](README.ur-PK.md), [Английский](README.md), [Китайский](README.zh-cn.md), [Бразильский Португальский](README.pt-br.md), [Испанский](README-es.md), [Польский](README.pl.md), [Kорейский](README.ko-kr.md), [French](README-fr.md)._
4 4
5 [![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get) 5 [![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get)
6 ![building](https://github.com/jonataslaw/get/workflows/build/badge.svg) 6 ![building](https://github.com/jonataslaw/get/workflows/build/badge.svg)
@@ -29,14 +29,14 @@ _Языки: Русский (этот файл), [индонезийский](RE @@ -29,14 +29,14 @@ _Языки: Русский (этот файл), [индонезийский](RE
29 - [Утилиты](#утилиты) 29 - [Утилиты](#утилиты)
30 - [Интернационализация](#интернационализация) 30 - [Интернационализация](#интернационализация)
31 - [Переводы](#переводы) 31 - [Переводы](#переводы)
32 - - [Применение переводов](#применение-переводов) 32 + - [Использование переводов](#использование-переводов)
33 - [Локализация](#локализация) 33 - [Локализация](#локализация)
34 - [Изменение локализации](#изменение-локализации) 34 - [Изменение локализации](#изменение-локализации)
35 - - [Системная локализация](#системная-локализации) 35 + - [Системная локализация](#системная-локализация)
36 - [Изменение темы](#изменение-темы) 36 - [Изменение темы](#изменение-темы)
37 - [Другие API](#другие-api) 37 - [Другие API](#другие-api)
38 - [Дополнительные глобальные настройки и ручные настройки](#дополнительные-глобальные-настройки-и-ручные-настройки) 38 - [Дополнительные глобальные настройки и ручные настройки](#дополнительные-глобальные-настройки-и-ручные-настройки)
39 - - [Локальные виджеты состояния](#локальные-виджеты-состояний) 39 + - [Локальные виджеты состояния](#локальные-виджеты-состояния)
40 - [ValueBuilder](#valuebuilder) 40 - [ValueBuilder](#valuebuilder)
41 - [ObxValue](#obxvalue) 41 - [ObxValue](#obxvalue)
42 - [Полезные советы](#полезные-советы) 42 - [Полезные советы](#полезные-советы)
@@ -45,7 +45,7 @@ _Языки: Русский (этот файл), [индонезийский](RE @@ -45,7 +45,7 @@ _Языки: Русский (этот файл), [индонезийский](RE
45 - [GetxService](#getxservice) 45 - [GetxService](#getxservice)
46 - [Критические изменения по сравнению с версией 2.0](#критические-изменения-по-сравнению-с-версией-20) 46 - [Критические изменения по сравнению с версией 2.0](#критические-изменения-по-сравнению-с-версией-20)
47 - [Почему Getx?](#почему-getx) 47 - [Почему Getx?](#почему-getx)
48 -- [Сообщество](#сообщество) 48 +- [Сообщества](#сообщества)
49 - [Каналы сообщества](#каналы-сообщества) 49 - [Каналы сообщества](#каналы-сообщества)
50 - [Как внести свой вклад](#как-внести-свой-вклад) 50 - [Как внести свой вклад](#как-внести-свой-вклад)
51 - [Статьи и видео](#статьи-и-видео) 51 - [Статьи и видео](#статьи-и-видео)
@@ -129,7 +129,7 @@ class Home extends StatelessWidget { @@ -129,7 +129,7 @@ class Home extends StatelessWidget {
129 appBar: AppBar(title: Obx(() => Text("Кликов: ${c.count}"))), 129 appBar: AppBar(title: Obx(() => Text("Кликов: ${c.count}"))),
130 130
131 // Замените 8 строк Navigator.push простым Get.to(). Вам не нужен context! 131 // Замените 8 строк Navigator.push простым Get.to(). Вам не нужен context!
132 - body: Center(child: RaisedButton( 132 + body: Center(child: ElevatedButton(
133 child: Text("Перейти к Other"), onPressed: () => Get.to(Other()))), 133 child: Text("Перейти к Other"), onPressed: () => Get.to(Other()))),
134 floatingActionButton: 134 floatingActionButton:
135 FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment)); 135 FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment));
@@ -811,7 +811,7 @@ class SettingsService extends GetxService { @@ -811,7 +811,7 @@ class SettingsService extends GetxService {
811 811
812 1- Rx типы: 812 1- Rx типы:
813 813
814 -| До | После | 814 +| До | После |
815 | ------- | ---------- | 815 | ------- | ---------- |
816 | StringX | `RxString` | 816 | StringX | `RxString` |
817 | IntX | `RxInt` | 817 | IntX | `RxInt` |
1 ![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) 1 ![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png)
2 2
3 -**🌎 اردو ( Selected ✔) [| انگریزی |](README.md) [| انڈونیشی |](README.id-ID.md) [چینی |](README.zh-cn.md) [برازیلی پرتگالی |](README.pt-br.md) [ہسپانوی |](README-es.md) [روسی |](README.ru.md) [پولش |](README.pl.md) [کورین |](README.ko-kr.md)** 3 +**🌎 اردو ( Selected ✔) [| انگریزی |](README.md) [| انڈونیشی |](README.id-ID.md) [چینی |](README.zh-cn.md) [برازیلی پرتگالی |](README.pt-br.md) [ہسپانوی |](README-es.md) [روسی |](README.ru.md) [پولش |](README.pl.md) [کورین |](README.ko-kr.md), [French](README-fr.md)**
4 4
5 [![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get) 5 [![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get)
6 [![likes](https://badges.bar/get/likes)](https://pub.dev/packages/get/score) 6 [![likes](https://badges.bar/get/likes)](https://pub.dev/packages/get/score)
@@ -42,11 +42,13 @@ @@ -42,11 +42,13 @@
42 - [ترجیح](#ترجیح) 42 - [ترجیح](#ترجیح)
43 - [ری ڈائریکٹ](#ری-ڈائریکٹ) 43 - [ری ڈائریکٹ](#ری-ڈائریکٹ)
44 - [جب پیج کی درخواست کی جائے](#جب-پیج-کی-درخواست-کی-جائے) 44 - [جب پیج کی درخواست کی جائے](#جب-پیج-کی-درخواست-کی-جائے)
  45 + - [آنبائنڈنگ اسٹارٹ](#آنبائنڈنگ-اسٹارٹ)
  46 + - [آنپیج بلڈ اسٹارٹ](#آنپیج-بلڈ-اسٹارٹ)
45 - [جب پیج لوڈ ہو](#جب-پیج-لوڈ-ہو) 47 - [جب پیج لوڈ ہو](#جب-پیج-لوڈ-ہو)
46 - [جب صفحہ تصرف ہوجائے](#جب-صفحہ-تصرف-ہوجائے) 48 - [جب صفحہ تصرف ہوجائے](#جب-صفحہ-تصرف-ہوجائے)
47 - - [دوسرے اعلی درجے کی APIs](#دوسرے-اعلی-درجے-کی-APIs) 49 + - [دوسرے اعلی درجے کی APIs](#دوسرے-اعلی-درجے-کی-apis)
48 - [اختیاری عالمی ترتیبات اور دستی تشکیلات](#اختیاری-عالمی-ترتیبات-اور-دستی-تشکیلات) 50 - [اختیاری عالمی ترتیبات اور دستی تشکیلات](#اختیاری-عالمی-ترتیبات-اور-دستی-تشکیلات)
49 - - [مقامی اسٹیٹ ویجٹ](#مقامی-اسٹیٹ-ویجٹ) - 51 + - [مقامی اسٹیٹ ویجٹ](#مقامی-اسٹیٹ-ویجٹ)
50 - [ویلیو بلڈر](#ویلیو-بلڈر) 52 - [ویلیو بلڈر](#ویلیو-بلڈر)
51 - [اوبکس ویلیو](#اوبکس-ویلیو) 53 - [اوبکس ویلیو](#اوبکس-ویلیو)
52 - [کارآمد نکات](#کارآمد-نکات) 54 - [کارآمد نکات](#کارآمد-نکات)
@@ -54,7 +56,7 @@ @@ -54,7 +56,7 @@
54 - [گیٹ ویجٹ](#گیٹ-ویجٹ) 56 - [گیٹ ویجٹ](#گیٹ-ویجٹ)
55 - [گیٹکس سروس](#گیٹکس-سروس) 57 - [گیٹکس سروس](#گیٹکس-سروس)
56 - [پچھلے ورژن سے اہم تبدیلیاں](#پچھلے-ورژن-سے-اہم-تبدیلیاں) 58 - [پچھلے ورژن سے اہم تبدیلیاں](#پچھلے-ورژن-سے-اہم-تبدیلیاں)
57 -- [گیٹکس کیوں؟](#گیٹکس-کیوں؟) 59 +- [گیٹکس کیوں؟](#گیٹکس-کیوں)
58 - [سماجی خدمات](#سماجی-خدمات) 60 - [سماجی خدمات](#سماجی-خدمات)
59 - [کمیونٹی چینلز](#کمیونٹی-چینلز) 61 - [کمیونٹی چینلز](#کمیونٹی-چینلز)
60 - [کس طرح شراکت کریں](#کس-طرح-شراکت-کریں) 62 - [کس طرح شراکت کریں](#کس-طرح-شراکت-کریں)
@@ -135,7 +137,7 @@ class Home extends StatelessWidget { @@ -135,7 +137,7 @@ class Home extends StatelessWidget {
135 appBar: AppBar(title: Obx(() => Text("Clicks: ${c.count}"))), 137 appBar: AppBar(title: Obx(() => Text("Clicks: ${c.count}"))),
136 138
137 // Replace the 8 lines Navigator.push by a simple Get.to(). You don't need context 139 // Replace the 8 lines Navigator.push by a simple Get.to(). You don't need context
138 - body: Center(child: RaisedButton( 140 + body: Center(child: ElevatedButton(
139 child: Text("Go to Other"), onPressed: () => Get.to(Other()))), 141 child: Text("Go to Other"), onPressed: () => Get.to(Other()))),
140 floatingActionButton: 142 floatingActionButton:
141 FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment)); 143 FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment));
1 ![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) 1 ![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png)
2 2
3 -_语言: 中文, [英文](README.md), [印度尼西亚](README.id-ID.md), [乌尔都语](README.ur-PK.md), [巴西葡萄牙语](README.pt-br.md), [俄语](README.ru.md), [西班牙语](README-es.md), [波兰语](README.pl.md), [韩国语](README.ko-kr.md)._ 3 +_语言: 中文, [英文](README.md), [印度尼西亚](README.id-ID.md), [乌尔都语](README.ur-PK.md), [巴西葡萄牙语](README.pt-br.md), [俄语](README.ru.md), [西班牙语](README-es.md), [波兰语](README.pl.md), [韩国语](README.ko-kr.md), [法语](README-fr.md), [French](README-fr.md)._
4 4
5 [![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get) 5 [![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get)
6 ![building](https://github.com/jonataslaw/get/workflows/build/badge.svg) 6 ![building](https://github.com/jonataslaw/get/workflows/build/badge.svg)
@@ -67,8 +67,13 @@ _霂剛: 銝剜, [(README.md), [摨血側镼蹂(README.id-ID.md), [銋 @@ -67,8 +67,13 @@ _霂剛: 銝剜, [(README.md), [摨血側镼蹂(README.id-ID.md), [銋
67 67
68 **此外,通过[Get CLI](https://github.com/jonataslaw/get_cli)**,无论是在服务器上还是在前端,整个开发过程都可以完全自动化。 68 **此外,通过[Get CLI](https://github.com/jonataslaw/get_cli)**,无论是在服务器上还是在前端,整个开发过程都可以完全自动化。
69 69
70 -**此外,为了进一步提高您的生产效率,我们还为您准备了  
71 -[VSCode扩展](https://marketplace.visualstudio.com/items?itemName=get-snippets.get-snippets)[Android Studio/Intellij扩展](https://plugins.jetbrains.com/plugin/14975-getx-snippets)** 70 +**此外,为了进一步提高您的生产效率,我们还为您准备了一些插件**
  71 +
  72 +- **getx_template**:一键生成每个页面必需的文件夹、文件、模板代码等等
  73 + - [Android Studio/Intellij插件](https://plugins.jetbrains.com/plugin/15919-getx)
  74 +- **GetX Snippets**:输入少量字母,自动提示选择后,可生成常用的模板代码
  75 + - [Android Studio/Intellij扩展](https://plugins.jetbrains.com/plugin/14975-getx-snippets)
  76 + - [VSCode扩展](https://marketplace.visualstudio.com/items?itemName=get-snippets.get-snippets)
72 77
73 # 安装 78 # 安装
74 79
@@ -133,7 +138,7 @@ class Home extends StatelessWidget { @@ -133,7 +138,7 @@ class Home extends StatelessWidget {
133 appBar: AppBar(title: Obx(() => Text("Clicks: ${c.count}"))), 138 appBar: AppBar(title: Obx(() => Text("Clicks: ${c.count}"))),
134 139
135 // 用一个简单的Get.to()即可代替Navigator.push那8行,无需上下文! 140 // 用一个简单的Get.to()即可代替Navigator.push那8行,无需上下文!
136 - body: Center(child: RaisedButton( 141 + body: Center(child: ElevatedButton(
137 child: Text("Go to Other"), onPressed: () => Get.to(Other()))), 142 child: Text("Go to Other"), onPressed: () => Get.to(Other()))),
138 floatingActionButton: 143 floatingActionButton:
139 FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment)); 144 FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment));
@@ -209,7 +214,7 @@ Obx(() => Text("${controller.name}")); @@ -209,7 +214,7 @@ Obx(() => Text("${controller.name}"));
209 214
210 ### 关于状态管理的更多细节 215 ### 关于状态管理的更多细节
211 216
212 -**关于状态管理更深入的解释请查看[这里](./documentation/zh_CN/state_management.md)。在那里你将看到更多的例子,以及简单的阶段管理器和响应式状态管理器之间的区别** 217 +**关于状态管理更深入的解释请查看[这里](./documentation/zh_CN/state_management.md)。在那里你将看到更多的例子,以及简单的状态管理器和响应式状态管理器之间的区别**
213 218
214 你会对GetX的能力有一个很好的了解。 219 你会对GetX的能力有一个很好的了解。
215 220
@@ -906,4 +911,6 @@ _銝粹★插賑撠鞊芸撘箄賑 @@ -906,4 +911,6 @@ _銝粹★插賑撠鞊芸撘箄賑
906 - [GetX Flutter Firebase Auth Example](https://medium.com/@jeffmcmorris/getx-flutter-firebase-auth-example-b383c1dd1de2) - Article by Jeff McMorris. 911 - [GetX Flutter Firebase Auth Example](https://medium.com/@jeffmcmorris/getx-flutter-firebase-auth-example-b383c1dd1de2) - Article by Jeff McMorris.
907 - [Flutter State Management with GetX – Complete App](https://www.appwithflutter.com/flutter-state-management-with-getx/) - by App With Flutter. 912 - [Flutter State Management with GetX – Complete App](https://www.appwithflutter.com/flutter-state-management-with-getx/) - by App With Flutter.
908 - [Flutter Routing with Animation using Get Package](https://www.appwithflutter.com/flutter-routing-using-get-package/) - by App With Flutter. 913 - [Flutter Routing with Animation using Get Package](https://www.appwithflutter.com/flutter-routing-using-get-package/) - by App With Flutter.
  914 +- [Flutter GetX use --- simple charm!](https://github.com/CNAD666/getx_template/blob/main/docs/Use%20of%20Flutter%20GetX---simple%20charm!.md) - CNAD666
  915 + - [Flutter GetX使用---简洁的魅力!](https://juejin.cn/post/6924104248275763208)
909 916
@@ -20,6 +20,8 @@ linter: @@ -20,6 +20,8 @@ linter:
20 # INCLUDE_FIX (copy of effective dart 1.2.0) 20 # INCLUDE_FIX (copy of effective dart 1.2.0)
21 # STYLE 21 # STYLE
22 camel_case_types: true 22 camel_case_types: true
  23 + close_sinks: true
  24 + unnecessary_statements: true
23 camel_case_extensions: true 25 camel_case_extensions: true
24 library_names: true 26 library_names: true
25 file_names: true 27 file_names: true
@@ -61,6 +63,7 @@ linter: @@ -61,6 +63,7 @@ linter:
61 avoid_catches_without_on_clauses: true # avoid 63 avoid_catches_without_on_clauses: true # avoid
62 avoid_catching_errors: true 64 avoid_catching_errors: true
63 use_rethrow_when_possible: true 65 use_rethrow_when_possible: true
  66 + unrelated_type_equality_checks: true
64 67
65 # DESIGN 68 # DESIGN
66 use_to_and_as_if_applicable: true # prefer 69 use_to_and_as_if_applicable: true # prefer
@@ -81,9 +81,9 @@ It is possible to lazyLoad a dependency so that it will be instantiated only whe @@ -81,9 +81,9 @@ It is possible to lazyLoad a dependency so that it will be instantiated only whe
81 Get.lazyPut<ApiMock>(() => ApiMock()); 81 Get.lazyPut<ApiMock>(() => ApiMock());
82 82
83 Get.lazyPut<FirebaseAuth>( 83 Get.lazyPut<FirebaseAuth>(
84 - () => {  
85 - // ... some logic if needed  
86 - return FirebaseAuth() 84 + () {
  85 + // ... some logic if needed
  86 + return FirebaseAuth();
87 }, 87 },
88 tag: Math.random().toString(), 88 tag: Math.random().toString(),
89 fenix: true 89 fenix: true
@@ -309,7 +309,7 @@ getPages: [ @@ -309,7 +309,7 @@ getPages: [
309 GetPage( 309 GetPage(
310 name: '/', 310 name: '/',
311 page: () => HomeView(), 311 page: () => HomeView(),
312 - binding: BindingsBuilder(() => { 312 + binding: BindingsBuilder(() {
313 Get.lazyPut<ControllerX>(() => ControllerX()); 313 Get.lazyPut<ControllerX>(() => ControllerX());
314 Get.put<Service>(()=> Api()); 314 Get.put<Service>(()=> Api());
315 }), 315 }),
@@ -317,7 +317,7 @@ getPages: [ @@ -317,7 +317,7 @@ getPages: [
317 GetPage( 317 GetPage(
318 name: '/details', 318 name: '/details',
319 page: () => DetailsView(), 319 page: () => DetailsView(),
320 - binding: BindingsBuilder(() => { 320 + binding: BindingsBuilder(() {
321 Get.lazyPut<DetailsController>(() => DetailsController()); 321 Get.lazyPut<DetailsController>(() => DetailsController());
322 }), 322 }),
323 ), 323 ),
@@ -246,6 +246,28 @@ print(Get.parameters['user']); @@ -246,6 +246,28 @@ print(Get.parameters['user']);
246 // out: 34954 246 // out: 34954
247 ``` 247 ```
248 248
  249 +or send multiple parameters like this
  250 +
  251 +```dart
  252 +Get.toNamed("/profile/34954?flag=true&country=italy");
  253 +```
  254 +or
  255 +```dart
  256 +var parameters = <String, String>{"flag": "true","country": "italy",};
  257 +Get.toNamed("/profile/34954", parameters: parameters);
  258 +```
  259 +
  260 +On second screen take the data by parameters as usually
  261 +
  262 +```dart
  263 +print(Get.parameters['user']);
  264 +print(Get.parameters['flag']);
  265 +print(Get.parameters['country']);
  266 +// out: 34954 true italy
  267 +```
  268 +
  269 +
  270 +
249 And now, all you need to do is use Get.toNamed() to navigate your named routes, without any context (you can call your routes directly from your BLoC or Controller class), and when your app is compiled to the web, your routes will appear in the url <3 271 And now, all you need to do is use Get.toNamed() to navigate your named routes, without any context (you can call your routes directly from your BLoC or Controller class), and when your app is compiled to the web, your routes will appear in the url <3
250 272
251 ### Middleware 273 ### Middleware
@@ -313,7 +335,7 @@ class First extends StatelessWidget { @@ -313,7 +335,7 @@ class First extends StatelessWidget {
313 title: Text('First Route'), 335 title: Text('First Route'),
314 ), 336 ),
315 body: Center( 337 body: Center(
316 - child: RaisedButton( 338 + child: ElevatedButton(
317 child: Text('Open route'), 339 child: Text('Open route'),
318 onPressed: () { 340 onPressed: () {
319 Get.toNamed("/second"); 341 Get.toNamed("/second");
@@ -338,7 +360,7 @@ class Second extends StatelessWidget { @@ -338,7 +360,7 @@ class Second extends StatelessWidget {
338 title: Text('second Route'), 360 title: Text('second Route'),
339 ), 361 ),
340 body: Center( 362 body: Center(
341 - child: RaisedButton( 363 + child: ElevatedButton(
342 child: Text('Open route'), 364 child: Text('Open route'),
343 onPressed: () { 365 onPressed: () {
344 Get.toNamed("/third"); 366 Get.toNamed("/third");
@@ -357,7 +379,7 @@ class Third extends StatelessWidget { @@ -357,7 +379,7 @@ class Third extends StatelessWidget {
357 title: Text("Third Route"), 379 title: Text("Third Route"),
358 ), 380 ),
359 body: Center( 381 body: Center(
360 - child: RaisedButton( 382 + child: ElevatedButton(
361 onPressed: () { 383 onPressed: () {
362 Get.back(); 384 Get.back();
363 }, 385 },
@@ -428,7 +450,7 @@ Get.snackbar( @@ -428,7 +450,7 @@ Get.snackbar(
428 // Color leftBarIndicatorColor, 450 // Color leftBarIndicatorColor,
429 // List<BoxShadow> boxShadows, 451 // List<BoxShadow> boxShadows,
430 // Gradient backgroundGradient, 452 // Gradient backgroundGradient,
431 - // FlatButton mainButton, 453 + // TextButton mainButton,
432 // OnTap onTap, 454 // OnTap onTap,
433 // bool isDismissible, 455 // bool isDismissible,
434 // bool showProgressIndicator, 456 // bool showProgressIndicator,
@@ -484,12 +506,12 @@ Get.bottomSheet( @@ -484,12 +506,12 @@ Get.bottomSheet(
484 ListTile( 506 ListTile(
485 leading: Icon(Icons.music_note), 507 leading: Icon(Icons.music_note),
486 title: Text('Music'), 508 title: Text('Music'),
487 - onTap: () => {} 509 + onTap: () {}
488 ), 510 ),
489 ListTile( 511 ListTile(
490 leading: Icon(Icons.videocam), 512 leading: Icon(Icons.videocam),
491 title: Text('Video'), 513 title: Text('Video'),
492 - onTap: () => {}, 514 + onTap: () {},
493 ), 515 ),
494 ], 516 ],
495 ), 517 ),
@@ -518,7 +540,7 @@ Navigator( @@ -518,7 +540,7 @@ Navigator(
518 title: Text("Main"), 540 title: Text("Main"),
519 ), 541 ),
520 body: Center( 542 body: Center(
521 - child: FlatButton( 543 + child: TextButton(
522 color: Colors.blue, 544 color: Colors.blue,
523 onPressed: () { 545 onPressed: () {
524 Get.toNamed('/second', id:1); // navigate by your nested route by index 546 Get.toNamed('/second', id:1); // navigate by your nested route by index
1 -- [State Management](#state-management)  
2 - - [Reactive State Manager](#reactive-state-manager) 1 +* [State Management](#state-management)
  2 + + [Reactive State Manager](#reactive-state-manager)
3 - [Advantages](#advantages) 3 - [Advantages](#advantages)
4 - [Maximum performance:](#maximum-performance) 4 - [Maximum performance:](#maximum-performance)
5 - [Declaring a reactive variable](#declaring-a-reactive-variable) 5 - [Declaring a reactive variable](#declaring-a-reactive-variable)
@@ -11,7 +11,7 @@ @@ -11,7 +11,7 @@
11 - [Why i have to use .value](#why-i-have-to-use-value) 11 - [Why i have to use .value](#why-i-have-to-use-value)
12 - [Obx()](#obx) 12 - [Obx()](#obx)
13 - [Workers](#workers) 13 - [Workers](#workers)
14 - - [Simple State Manager](#simple-state-manager) 14 + + [Simple State Manager](#simple-state-manager)
15 - [Advantages](#advantages-1) 15 - [Advantages](#advantages-1)
16 - [Usage](#usage) 16 - [Usage](#usage)
17 - [How it handles controllers](#how-it-handles-controllers) 17 - [How it handles controllers](#how-it-handles-controllers)
@@ -19,30 +19,35 @@ @@ -19,30 +19,35 @@
19 - [Why it exists](#why-it-exists) 19 - [Why it exists](#why-it-exists)
20 - [Other ways of using it](#other-ways-of-using-it) 20 - [Other ways of using it](#other-ways-of-using-it)
21 - [Unique IDs](#unique-ids) 21 - [Unique IDs](#unique-ids)
22 - - [Mixing the two state managers](#mixing-the-two-state-managers)  
23 - - [GetBuilder vs GetX vs Obx vs MixinBuilder](#getbuilder-vs-getx-vs-obx-vs-mixinbuilder) 22 + + [Mixing the two state managers](#mixing-the-two-state-managers)
  23 + + [GetBuilder vs GetX vs Obx vs MixinBuilder](#getbuilder-vs-getx-vs-obx-vs-mixinbuilder)
24 24
25 # State Management 25 # State Management
26 26
27 GetX does not use Streams or ChangeNotifier like other state managers. Why? In addition to building applications for android, iOS, web, linux, macos and linux, with GetX you can build server applications with the same syntax as Flutter/GetX. In order to improve response time and reduce RAM consumption, we created GetValue and GetStream, which are low latency solutions that deliver a lot of performance, at a low operating cost. We use this base to build all of our resources, including state management. 27 GetX does not use Streams or ChangeNotifier like other state managers. Why? In addition to building applications for android, iOS, web, linux, macos and linux, with GetX you can build server applications with the same syntax as Flutter/GetX. In order to improve response time and reduce RAM consumption, we created GetValue and GetStream, which are low latency solutions that deliver a lot of performance, at a low operating cost. We use this base to build all of our resources, including state management.
28 28
29 -- _Complexity_: Some state managers are complex and have a lot of boilerplate. With GetX you don't have to define a class for each event, the code is highly clean and clear, and you do a lot more by writing less. Many people have given up on Flutter because of this topic, and they now finally have a stupidly simple solution for managing states.  
30 -- _No code generators_: You spend half your development time writing your application logic. Some state managers rely on code generators to have minimally readable code. Changing a variable and having to run build_runner can be unproductive, and often the waiting time after a flutter clean will be long, and you will have to drink a lot of coffee. 29 +* _Complexity_: Some state managers are complex and have a lot of boilerplate. With GetX you don't have to define a class for each event, the code is highly clean and clear, and you do a lot more by writing less. Many people have given up on Flutter because of this topic, and they now finally have a stupidly simple solution for managing states.
  30 +* _No code generators_: You spend half your development time writing your application logic. Some state managers rely on code generators to have minimally readable code. Changing a variable and having to run build_runner can be unproductive, and often the waiting time after a flutter clean will be long, and you will have to drink a lot of coffee.
  31 +
31 With GetX everything is reactive, and nothing depends on code generators, increasing your productivity in all aspects of your development. 32 With GetX everything is reactive, and nothing depends on code generators, increasing your productivity in all aspects of your development.
32 -- _It does not depend on context_: You probably already needed to send the context of your view to a controller, making the View's coupling with your business logic high. You have probably had to use a dependency for a place that has no context, and had to pass the context through various classes and functions. This just doesn't exist with GetX. You have access to your controllers from within your controllers without any context. You don't need to send the context by parameter for literally nothing.  
33 -- _Granular control_: most state managers are based on ChangeNotifier. ChangeNotifier will notify all widgets that depend on it when notifyListeners is called. If you have 40 widgets on one screen, which have a variable of your ChangeNotifier class, when you update one, all of them will be rebuilt. 33 +
  34 +* _It does not depend on context_: You probably already needed to send the context of your view to a controller, making the View's coupling with your business logic high. You have probably had to use a dependency for a place that has no context, and had to pass the context through various classes and functions. This just doesn't exist with GetX. You have access to your controllers from within your controllers without any context. You don't need to send the context by parameter for literally nothing.
  35 +* _Granular control_: most state managers are based on ChangeNotifier. ChangeNotifier will notify all widgets that depend on it when notifyListeners is called. If you have 40 widgets on one screen, which have a variable of your ChangeNotifier class, when you update one, all of them will be rebuilt.
  36 +
34 With GetX, even nested widgets are respected. If you have Obx watching your ListView, and another watching a checkbox inside the ListView, when changing the CheckBox value, only it will be updated, when changing the List value, only the ListView will be updated. 37 With GetX, even nested widgets are respected. If you have Obx watching your ListView, and another watching a checkbox inside the ListView, when changing the CheckBox value, only it will be updated, when changing the List value, only the ListView will be updated.
35 -- _It only reconstructs if its variable REALLY changes_: GetX has flow control, that means if you display a Text with 'Paola', if you change the observable variable to 'Paola' again, the widget will not be reconstructed. That's because GetX knows that 'Paola' is already being displayed in Text, and will not do unnecessary reconstructions. 38 +
  39 +* _It only reconstructs if its variable REALLY changes_: GetX has flow control, that means if you display a Text with 'Paola', if you change the observable variable to 'Paola' again, the widget will not be reconstructed. That's because GetX knows that 'Paola' is already being displayed in Text, and will not do unnecessary reconstructions.
  40 +
36 Most (if not all) current state managers will rebuild on the screen. 41 Most (if not all) current state managers will rebuild on the screen.
37 42
38 ## Reactive State Manager 43 ## Reactive State Manager
39 44
40 Reactive programming can alienate many people because it is said to be complicated. GetX turns reactive programming into something quite simple: 45 Reactive programming can alienate many people because it is said to be complicated. GetX turns reactive programming into something quite simple:
41 46
42 -- You won't need to create StreamControllers.  
43 -- You won't need to create a StreamBuilder for each variable  
44 -- You will not need to create a class for each state.  
45 -- You will not need to create a get for an initial value. 47 +* You won't need to create StreamControllers.
  48 +* You won't need to create a StreamBuilder for each variable
  49 +* You will not need to create a class for each state.
  50 +* You will not need to create a get for an initial value.
46 51
47 Reactive programming with Get is as easy as using setState. 52 Reactive programming with Get is as easy as using setState.
48 53
@@ -50,13 +55,13 @@ Let's imagine that you have a name variable and want that every time you change @@ -50,13 +55,13 @@ Let's imagine that you have a name variable and want that every time you change
50 55
51 This is your count variable: 56 This is your count variable:
52 57
53 -```dart 58 +``` dart
54 var name = 'Jonatas Borges'; 59 var name = 'Jonatas Borges';
55 ``` 60 ```
56 61
57 To make it observable, you just need to add ".obs" to the end of it: 62 To make it observable, you just need to add ".obs" to the end of it:
58 63
59 -```dart 64 +``` dart
60 var name = 'Jonatas Borges'.obs; 65 var name = 'Jonatas Borges'.obs;
61 ``` 66 ```
62 67
@@ -64,34 +69,34 @@ That's all. It's *that* simple. @@ -64,34 +69,34 @@ That's all. It's *that* simple.
64 69
65 From now on, we might refer to this reactive-".obs"(ervables) variables as _Rx_. 70 From now on, we might refer to this reactive-".obs"(ervables) variables as _Rx_.
66 71
67 -What did we do under the hood? We created a `Stream` of `String`s, assigned the initial value `"Jonatas Borges"`, we notified all widgets that use `"Jonatas Borges"` that they now "belong" to this variable, and when the _Rx_ value changes, they will have to change as well. 72 +What did we do under the hood? We created a `Stream` of `String` s, assigned the initial value `"Jonatas Borges"` , we notified all widgets that use `"Jonatas Borges"` that they now "belong" to this variable, and when the _Rx_ value changes, they will have to change as well.
68 73
69 This is the **magic of GetX**, thanks to Dart's capabilities. 74 This is the **magic of GetX**, thanks to Dart's capabilities.
70 75
71 But, as we know, a `Widget` can only be changed if it is inside a function, because static classes do not have the power to "auto-change". 76 But, as we know, a `Widget` can only be changed if it is inside a function, because static classes do not have the power to "auto-change".
72 77
73 -You will need to create a `StreamBuilder`, subscribe to this variable to listen for changes, and create a "cascade" of nested `StreamBuilder` if you want to change several variables in the same scope, right? 78 +You will need to create a `StreamBuilder` , subscribe to this variable to listen for changes, and create a "cascade" of nested `StreamBuilder` if you want to change several variables in the same scope, right?
74 79
75 -No, you don't need a `StreamBuilder`, but you are right about static classes. 80 +No, you don't need a `StreamBuilder` , but you are right about static classes.
76 81
77 Well, in the view, we usually have a lot of boilerplate when we want to change a specific Widget, that's the Flutter way. 82 Well, in the view, we usually have a lot of boilerplate when we want to change a specific Widget, that's the Flutter way.
78 With **GetX** you can also forget about this boilerplate code. 83 With **GetX** you can also forget about this boilerplate code.
79 84
80 -`StreamBuilder( … )`? `initialValue: …`? `builder: …`? Nope, you just need to place this variable inside an `Obx()` Widget. 85 +`StreamBuilder( … )` ? `initialValue: …` ? `builder: …` ? Nope, you just need to place this variable inside an `Obx()` Widget.
81 86
82 -```dart 87 +``` dart
83 Obx (() => Text (controller.name)); 88 Obx (() => Text (controller.name));
84 ``` 89 ```
85 90
86 -_What do you need to memorize?_ Only `Obx(() =>`. 91 +_What do you need to memorize?_ Only `Obx(() =>` .
87 92
88 You are just passing that Widget through an arrow-function into an `Obx()` (the "Observer" of the _Rx_). 93 You are just passing that Widget through an arrow-function into an `Obx()` (the "Observer" of the _Rx_).
89 94
90 `Obx` is pretty smart, and will only change if the value of `controller.name` changes. 95 `Obx` is pretty smart, and will only change if the value of `controller.name` changes.
91 96
92 -If `name` is `"John"`, and you change it to `"John"` (`name.value = "John"`), as it's the same `value` as before, nothing will change on the screen, and `Obx`, to save resources, will simply ignore the new value and not rebuild the Widget. **Isn't that amazing?** 97 +If `name` is `"John"` , and you change it to `"John"` ( `name.value = "John"` ), as it's the same `value` as before, nothing will change on the screen, and `Obx` , to save resources, will simply ignore the new value and not rebuild the Widget. **Isn't that amazing?**
93 98
94 -> So, what if I have 5 _Rx_ (observable) variables within an `Obx`? 99 +> So, what if I have 5 _Rx_ (observable) variables within an `Obx` ?
95 100
96 It will just update when **any** of them changes. 101 It will just update when **any** of them changes.
97 102
@@ -101,29 +106,32 @@ Nope, just the **specific Widget** that uses that _Rx_ variable. @@ -101,29 +106,32 @@ Nope, just the **specific Widget** that uses that _Rx_ variable.
101 106
102 So, **GetX** only updates the screen, when the _Rx_ variable changes it's value. 107 So, **GetX** only updates the screen, when the _Rx_ variable changes it's value.
103 108
104 -``` 109 +```
  110 +
105 final isOpen = false.obs; 111 final isOpen = false.obs;
106 112
107 // NOTHING will happen... same value. 113 // NOTHING will happen... same value.
108 void onButtonTap() => isOpen.value=false; 114 void onButtonTap() => isOpen.value=false;
109 ``` 115 ```
  116 +
110 ### Advantages 117 ### Advantages
111 118
112 **GetX()** helps you when you need **granular** control over what's being updated. 119 **GetX()** helps you when you need **granular** control over what's being updated.
113 120
114 -If you do not need `unique IDs`, because all your variables will be modified when you perform an action, then use `GetBuilder`,  
115 -because it's a Simple State Updater (in blocks, like `setState()`), made in just a few lines of code. 121 +If you do not need `unique IDs` , because all your variables will be modified when you perform an action, then use `GetBuilder` ,
  122 +because it's a Simple State Updater (in blocks, like `setState()` ), made in just a few lines of code.
116 It was made simple, to have the least CPU impact, and just to fulfill a single purpose (a _State_ rebuild) and spend the minimum resources possible. 123 It was made simple, to have the least CPU impact, and just to fulfill a single purpose (a _State_ rebuild) and spend the minimum resources possible.
117 124
118 If you need a **powerful** State Manager, you can't go wrong with **GetX**. 125 If you need a **powerful** State Manager, you can't go wrong with **GetX**.
119 126
120 It doesn't work with variables, but __flows__, everything in it are `Streams` under the hood. 127 It doesn't work with variables, but __flows__, everything in it are `Streams` under the hood.
  128 +
121 You can use _rxDart_ in conjunction with it, because everything are `Streams`, 129 You can use _rxDart_ in conjunction with it, because everything are `Streams`,
122 -you can listen the `event` of each "_Rx_ variable", 130 +you can listen to the `event` of each "_Rx_ variable",
123 because everything in it are `Streams`. 131 because everything in it are `Streams`.
124 132
125 It is literally a _BLoC_ approach, easier than _MobX_, and without code generators or decorations. 133 It is literally a _BLoC_ approach, easier than _MobX_, and without code generators or decorations.
126 -You can turn **anything** into an _"Observable"_ with just a `.obs`. 134 +You can turn **anything** into an _"Observable"_ with just a `.obs` .
127 135
128 ### Maximum performance: 136 ### Maximum performance:
129 137
@@ -134,19 +142,18 @@ If you experience any errors in your app, and send a duplicate change of State, @@ -134,19 +142,18 @@ If you experience any errors in your app, and send a duplicate change of State,
134 **GetX** will ensure it will not crash. 142 **GetX** will ensure it will not crash.
135 143
136 With **GetX** the State only changes if the `value` change. 144 With **GetX** the State only changes if the `value` change.
137 -That's the main difference between **GetX**, and using _`computed` from MobX_. 145 +That's the main difference between **GetX**, and using _ `computed` from MobX_.
138 When joining two __observables__, and one changes; the listener of that _observable_ will change as well. 146 When joining two __observables__, and one changes; the listener of that _observable_ will change as well.
139 147
140 -With **GetX**, if you join two variables, `GetX()` (similar to `Observer()`) will only rebuild if it implies a real change of State. 148 +With **GetX**, if you join two variables, `GetX()` (similar to `Observer()` ) will only rebuild if it implies a real change of State.
141 149
142 ### Declaring a reactive variable 150 ### Declaring a reactive variable
143 151
144 You have 3 ways to turn a variable into an "observable". 152 You have 3 ways to turn a variable into an "observable".
145 153
146 -  
147 1 - The first is using **`Rx{Type}`**. 154 1 - The first is using **`Rx{Type}`**.
148 155
149 -```dart 156 +``` dart
150 // initial value is recommended, but not mandatory 157 // initial value is recommended, but not mandatory
151 final name = RxString(''); 158 final name = RxString('');
152 final isLogged = RxBool(false); 159 final isLogged = RxBool(false);
@@ -158,7 +165,7 @@ final myMap = RxMap<String, int>({}); @@ -158,7 +165,7 @@ final myMap = RxMap<String, int>({});
158 165
159 2 - The second is to use **`Rx`** and use Darts Generics, `Rx<Type>` 166 2 - The second is to use **`Rx`** and use Darts Generics, `Rx<Type>`
160 167
161 -```dart 168 +``` dart
162 final name = Rx<String>(''); 169 final name = Rx<String>('');
163 final isLogged = Rx<Bool>(false); 170 final isLogged = Rx<Bool>(false);
164 final count = Rx<Int>(0); 171 final count = Rx<Int>(0);
@@ -171,9 +178,9 @@ final myMap = Rx<Map<String, int>>({}); @@ -171,9 +178,9 @@ final myMap = Rx<Map<String, int>>({});
171 final user = Rx<User>(); 178 final user = Rx<User>();
172 ``` 179 ```
173 180
174 -3 - The third, more practical, easier and preferred approach, just add **`.obs`** as a property of your `value`: 181 +3 - The third, more practical, easier and preferred approach, just add **`.obs`** as a property of your `value` :
175 182
176 -```dart 183 +``` dart
177 final name = ''.obs; 184 final name = ''.obs;
178 final isLogged = false.obs; 185 final isLogged = false.obs;
179 final count = 0.obs; 186 final count = 0.obs;
@@ -193,20 +200,19 @@ To be prepared, from now on, you should always start your _Rx_ variables with an @@ -193,20 +200,19 @@ To be prepared, from now on, you should always start your _Rx_ variables with an
193 200
194 > Transforming a variable into an _observable_ + _initial value_ with **GetX** is the simplest, and most practical approach. 201 > Transforming a variable into an _observable_ + _initial value_ with **GetX** is the simplest, and most practical approach.
195 202
196 -You will literally add a "`.obs`" to the end of your variable, and **that’s it**, you’ve made it observable,  
197 -and its `.value`, well, will be the _initial value_).  
198 - 203 +You will literally add a " `.obs` " to the end of your variable, and **that’s it**, you’ve made it observable,
  204 +and its `.value` , well, will be the _initial value_).
199 205
200 ### Using the values in the view 206 ### Using the values in the view
201 207
202 -```dart 208 +``` dart
203 // controller file 209 // controller file
204 final count1 = 0.obs; 210 final count1 = 0.obs;
205 final count2 = 0.obs; 211 final count2 = 0.obs;
206 int get sum => count1.value + count2.value; 212 int get sum => count1.value + count2.value;
207 ``` 213 ```
208 214
209 -```dart 215 +``` dart
210 // view file 216 // view file
211 GetX<Controller>( 217 GetX<Controller>(
212 builder: (controller) { 218 builder: (controller) {
@@ -228,30 +234,35 @@ GetX<Controller>( @@ -228,30 +234,35 @@ GetX<Controller>(
228 ), 234 ),
229 ``` 235 ```
230 236
231 -If we increment `count1.value++`, it will print:  
232 -- `count 1 rebuild`  
233 -- `count 3 rebuild` 237 +If we increment `count1.value++` , it will print:
  238 +
  239 +* `count 1 rebuild`
234 240
235 -because `count1` has a value of `1`, and `1 + 0 = 1`, changing the `sum` getter value. 241 +* `count 3 rebuild`
236 242
237 -If we change `count2.value++`, it will print:  
238 -- `count 2 rebuild`  
239 -- `count 3 rebuild` 243 +because `count1` has a value of `1` , and `1 + 0 = 1` , changing the `sum` getter value.
240 244
241 -because `count2.value` changed, and the result of the `sum` is now `2`. 245 +If we change `count2.value++` , it will print:
  246 +
  247 +* `count 2 rebuild`
  248 +
  249 +* `count 3 rebuild`
  250 +
  251 +because `count2.value` changed, and the result of the `sum` is now `2` .
  252 +
  253 +* NOTE: By default, the very first event will rebuild the widget, even if it is the same `value`.
242 254
243 -- NOTE: By default, the very first event will rebuild the widget, even if it is the same `value`.  
244 This behavior exists due to Boolean variables. 255 This behavior exists due to Boolean variables.
245 256
246 Imagine you did this: 257 Imagine you did this:
247 258
248 -```dart 259 +``` dart
249 var isLogged = false.obs; 260 var isLogged = false.obs;
250 ``` 261 ```
251 262
252 -And then, you checked if a user is "logged in" to trigger an event in `ever`. 263 +And then, you checked if a user is "logged in" to trigger an event in `ever` .
253 264
254 -```dart 265 +``` dart
255 @override 266 @override
256 onInit(){ 267 onInit(){
257 ever(isLogged, fireRoute); 268 ever(isLogged, fireRoute);
@@ -267,18 +278,18 @@ fireRoute(logged) { @@ -267,18 +278,18 @@ fireRoute(logged) {
267 } 278 }
268 ``` 279 ```
269 280
270 -if `hasToken` was `false`, there would be no change to `isLogged`, so `ever()` would never be called. 281 +if `hasToken` was `false` , there would be no change to `isLogged` , so `ever()` would never be called.
271 To avoid this type of behavior, the first change to an _observable_ will always trigger an event, 282 To avoid this type of behavior, the first change to an _observable_ will always trigger an event,
272 -even if it contains the same `.value`. 283 +even if it contains the same `.value` .
273 284
274 You can remove this behavior if you want, using: 285 You can remove this behavior if you want, using:
275 -`isLogged.firstRebuild = false;` 286 + `isLogged.firstRebuild = false;`
276 287
277 ### Conditions to rebuild 288 ### Conditions to rebuild
278 289
279 In addition, Get provides refined state control. You can condition an event (such as adding an object to a list), on a certain condition. 290 In addition, Get provides refined state control. You can condition an event (such as adding an object to a list), on a certain condition.
280 291
281 -```dart 292 +``` dart
282 // First parameter: condition, must return true or false. 293 // First parameter: condition, must return true or false.
283 // Second parameter: the new value to apply if the condition is true. 294 // Second parameter: the new value to apply if the condition is true.
284 list.addIf(item < limit, item); 295 list.addIf(item < limit, item);
@@ -288,7 +299,7 @@ Without decorations, without a code generator, without complications :smile: @@ -288,7 +299,7 @@ Without decorations, without a code generator, without complications :smile:
288 299
289 Do you know Flutter's counter app? Your Controller class might look like this: 300 Do you know Flutter's counter app? Your Controller class might look like this:
290 301
291 -```dart 302 +``` dart
292 class CountController extends GetxController { 303 class CountController extends GetxController {
293 final count = 0.obs; 304 final count = 0.obs;
294 } 305 }
@@ -296,7 +307,7 @@ class CountController extends GetxController { @@ -296,7 +307,7 @@ class CountController extends GetxController {
296 307
297 With a simple: 308 With a simple:
298 309
299 -```dart 310 +``` dart
300 controller.count.value++ 311 controller.count.value++
301 ``` 312 ```
302 313
@@ -307,7 +318,8 @@ You could update the counter variable in your UI, regardless of where it is stor @@ -307,7 +318,8 @@ You could update the counter variable in your UI, regardless of where it is stor
307 You can transform anything on obs. Here are two ways of doing it: 318 You can transform anything on obs. Here are two ways of doing it:
308 319
309 * You can convert your class values to obs 320 * You can convert your class values to obs
310 -```dart 321 +
  322 +``` dart
311 class RxUser { 323 class RxUser {
312 final name = "Camila".obs; 324 final name = "Camila".obs;
313 final age = 18.obs; 325 final age = 18.obs;
@@ -315,7 +327,8 @@ class RxUser { @@ -315,7 +327,8 @@ class RxUser {
315 ``` 327 ```
316 328
317 * or you can convert the entire class to be an observable 329 * or you can convert the entire class to be an observable
318 -```dart 330 +
  331 +``` dart
319 class User { 332 class User {
320 User({String name, int age}); 333 User({String name, int age});
321 var name; 334 var name;
@@ -333,7 +346,7 @@ Lists are completely observable as are the objects within it. That way, if you a @@ -333,7 +346,7 @@ Lists are completely observable as are the objects within it. That way, if you a
333 You also don't need to use ".value" with lists, the amazing dart api allowed us to remove that. 346 You also don't need to use ".value" with lists, the amazing dart api allowed us to remove that.
334 Unfortunaly primitive types like String and int cannot be extended, making the use of .value mandatory, but that won't be a problem if you work with gets and setters for these. 347 Unfortunaly primitive types like String and int cannot be extended, making the use of .value mandatory, but that won't be a problem if you work with gets and setters for these.
335 348
336 -```dart 349 +``` dart
337 // On the controller 350 // On the controller
338 final String title = 'User Info:'.obs 351 final String title = 'User Info:'.obs
339 final list = List<User>().obs; 352 final list = List<User>().obs;
@@ -347,7 +360,7 @@ ListView.builder ( @@ -347,7 +360,7 @@ ListView.builder (
347 360
348 When you are making your own classes observable, there is a different way to update them: 361 When you are making your own classes observable, there is a different way to update them:
349 362
350 -```dart 363 +``` dart
351 // on the model file 364 // on the model file
352 // we are going to make the entire class observable instead of each attribute 365 // we are going to make the entire class observable instead of each attribute
353 class User() { 366 class User() {
@@ -356,7 +369,6 @@ class User() { @@ -356,7 +369,6 @@ class User() {
356 int age; 369 int age;
357 } 370 }
358 371
359 -  
360 // on the controller file 372 // on the controller file
361 final user = User().obs; 373 final user = User().obs;
362 // when you need to update the user variable: 374 // when you need to update the user variable:
@@ -385,7 +397,7 @@ You can literally add 3 letters to your pubspec (get) and a colon and start prog @@ -385,7 +397,7 @@ You can literally add 3 letters to your pubspec (get) and a colon and start prog
385 397
386 The total weight of this library is less than that of a single state manager, even though it is a complete solution, and that is what you must understand. 398 The total weight of this library is less than that of a single state manager, even though it is a complete solution, and that is what you must understand.
387 399
388 -If you are bothered by `.value`, and like a code generator, MobX is a great alternative, and you can use it in conjunction with Get. For those who want to add a single dependency in pubspec and start programming without worrying about the version of a package being incompatible with another, or if the error of a state update is coming from the state manager or dependency, or still, do not want to worrying about the availability of controllers, whether literally "just programming", get is just perfect. 400 +If you are bothered by `.value` , and like a code generator, MobX is a great alternative, and you can use it in conjunction with Get. For those who want to add a single dependency in pubspec and start programming without worrying about the version of a package being incompatible with another, or if the error of a state update is coming from the state manager or dependency, or still, do not want to worrying about the availability of controllers, whether literally "just programming", get is just perfect.
389 401
390 If you have no problem with the MobX code generator, or have no problem with the BLoC boilerplate, you can simply use Get for routes, and forget that it has state manager. Get SEM and RSM were born out of necessity, my company had a project with more than 90 controllers, and the code generator simply took more than 30 minutes to complete its tasks after a Flutter Clean on a reasonably good machine, if your project it has 5, 10, 15 controllers, any state manager will supply you well. If you have an absurdly large project, and code generator is a problem for you, you have been awarded this solution. 402 If you have no problem with the MobX code generator, or have no problem with the BLoC boilerplate, you can simply use Get for routes, and forget that it has state manager. Get SEM and RSM were born out of necessity, my company had a project with more than 90 controllers, and the code generator simply took more than 30 minutes to complete its tasks after a Flutter Clean on a reasonably good machine, if your project it has 5, 10, 15 controllers, any state manager will supply you well. If you have an absurdly large project, and code generator is a problem for you, you have been awarded this solution.
391 403
@@ -400,7 +412,7 @@ Obviously, if you don't use a type, you will need to have an instance of your co @@ -400,7 +412,7 @@ Obviously, if you don't use a type, you will need to have an instance of your co
400 412
401 Workers will assist you, triggering specific callbacks when an event occurs. 413 Workers will assist you, triggering specific callbacks when an event occurs.
402 414
403 -```dart 415 +``` dart
404 /// Called every time `count1` changes. 416 /// Called every time `count1` changes.
405 ever(count1, (_) => print("$_ has been changed")); 417 ever(count1, (_) => print("$_ has been changed"));
406 418
@@ -413,28 +425,34 @@ debounce(count1, (_) => print("debouce$_"), time: Duration(seconds: 1)); @@ -413,28 +425,34 @@ debounce(count1, (_) => print("debouce$_"), time: Duration(seconds: 1));
413 /// Ignore all changes within 1 second. 425 /// Ignore all changes within 1 second.
414 interval(count1, (_) => print("interval $_"), time: Duration(seconds: 1)); 426 interval(count1, (_) => print("interval $_"), time: Duration(seconds: 1));
415 ``` 427 ```
416 -All workers (except `debounce`) have a `condition` named parameter, which can be a `bool` or a callback that returns a `bool`. 428 +
  429 +All workers (except `debounce` ) have a `condition` named parameter, which can be a `bool` or a callback that returns a `bool` .
417 This `condition` defines when the `callback` function executes. 430 This `condition` defines when the `callback` function executes.
418 431
419 All workers returns a `Worker` instance, that you can use to cancel ( via `dispose()` ) the worker. 432 All workers returns a `Worker` instance, that you can use to cancel ( via `dispose()` ) the worker.
420 433
421 -- **`ever`** 434 +
  435 +* **`ever`**
  436 +
422 is called every time the _Rx_ variable emits a new value. 437 is called every time the _Rx_ variable emits a new value.
423 438
424 -- **`everAll`**  
425 - Much like `ever`, but it takes a `List` of _Rx_ values Called every time its variable is changed. That's it. 439 +* **`everAll`**
  440 +
  441 + Much like `ever` , but it takes a `List` of _Rx_ values Called every time its variable is changed. That's it.
426 442
  443 +* **`once`**
427 444
428 -- **`once`**  
429 'once' is called only the first time the variable has been changed. 445 'once' is called only the first time the variable has been changed.
430 446
431 -- **`debounce`** 447 +* **`debounce`**
  448 +
432 'debounce' is very useful in search functions, where you only want the API to be called when the user finishes typing. If the user types "Jonny", you will have 5 searches in the APIs, by the letter J, o, n, n, and y. With Get this does not happen, because you will have a "debounce" Worker that will only be triggered at the end of typing. 449 'debounce' is very useful in search functions, where you only want the API to be called when the user finishes typing. If the user types "Jonny", you will have 5 searches in the APIs, by the letter J, o, n, n, and y. With Get this does not happen, because you will have a "debounce" Worker that will only be triggered at the end of typing.
433 450
434 -- **`interval`** 451 +* **`interval`**
  452 +
435 'interval' is different from the debouce. debouce if the user makes 1000 changes to a variable within 1 second, he will send only the last one after the stipulated timer (the default is 800 milliseconds). Interval will instead ignore all user actions for the stipulated period. If you send events for 1 minute, 1000 per second, debounce will only send you the last one, when the user stops strafing events. interval will deliver events every second, and if set to 3 seconds, it will deliver 20 events that minute. This is recommended to avoid abuse, in functions where the user can quickly click on something and get some advantage (imagine that the user can earn coins by clicking on something, if he clicked 300 times in the same minute, he would have 300 coins, using interval, you you can set a time frame for 3 seconds, and even then clicking 300 or a thousand times, the maximum he would get in 1 minute would be 20 coins, clicking 300 or 1 million times). The debounce is suitable for anti-DDos, for functions like search where each change to onChange would cause a query to your api. Debounce will wait for the user to stop typing the name, to make the request. If it were used in the coin scenario mentioned above, the user would only win 1 coin, because it is only executed, when the user "pauses" for the established time. 453 'interval' is different from the debouce. debouce if the user makes 1000 changes to a variable within 1 second, he will send only the last one after the stipulated timer (the default is 800 milliseconds). Interval will instead ignore all user actions for the stipulated period. If you send events for 1 minute, 1000 per second, debounce will only send you the last one, when the user stops strafing events. interval will deliver events every second, and if set to 3 seconds, it will deliver 20 events that minute. This is recommended to avoid abuse, in functions where the user can quickly click on something and get some advantage (imagine that the user can earn coins by clicking on something, if he clicked 300 times in the same minute, he would have 300 coins, using interval, you you can set a time frame for 3 seconds, and even then clicking 300 or a thousand times, the maximum he would get in 1 minute would be 20 coins, clicking 300 or 1 million times). The debounce is suitable for anti-DDos, for functions like search where each change to onChange would cause a query to your api. Debounce will wait for the user to stop typing the name, to make the request. If it were used in the coin scenario mentioned above, the user would only win 1 coin, because it is only executed, when the user "pauses" for the established time.
436 454
437 -- NOTE: Workers should always be used when starting a Controller or Class, so it should always be on onInit (recommended), Class constructor, or the initState of a StatefulWidget (this practice is not recommended in most cases, but it shouldn't have any side effects). 455 +* NOTE: Workers should always be used when starting a Controller or Class, so it should always be on onInit (recommended), Class constructor, or the initState of a StatefulWidget (this practice is not recommended in most cases, but it shouldn't have any side effects).
438 456
439 ## Simple State Manager 457 ## Simple State Manager
440 458
@@ -466,7 +484,7 @@ That way, if you want an individual controller, you can assign IDs for that, or @@ -466,7 +484,7 @@ That way, if you want an individual controller, you can assign IDs for that, or
466 484
467 ### Usage 485 ### Usage
468 486
469 -```dart 487 +``` dart
470 // Create controller class and extends GetxController 488 // Create controller class and extends GetxController
471 class Controller extends GetxController { 489 class Controller extends GetxController {
472 int counter = 0; 490 int counter = 0;
@@ -487,13 +505,13 @@ GetBuilder<Controller>( @@ -487,13 +505,13 @@ GetBuilder<Controller>(
487 505
488 **Done!** 506 **Done!**
489 507
490 -- You have already learned how to manage states with Get. 508 +* You have already learned how to manage states with Get.
491 509
492 -- Note: You may want a larger organization, and not use the init property. For that, you can create a class and extends Bindings class, and within it mention the controllers that will be created within that route. Controllers will not be created at that time, on the contrary, this is just a statement, so that the first time you use a Controller, Get will know where to look. Get will remain lazyLoad, and will continue to dispose Controllers when they are no longer needed. See the pub.dev example to see how it works. 510 +* Note: You may want a larger organization, and not use the init property. For that, you can create a class and extends Bindings class, and within it mention the controllers that will be created within that route. Controllers will not be created at that time, on the contrary, this is just a statement, so that the first time you use a Controller, Get will know where to look. Get will remain lazyLoad, and will continue to dispose Controllers when they are no longer needed. See the pub.dev example to see how it works.
493 511
494 If you navigate many routes and need data that was in your previously used controller, you just need to use GetBuilder Again (with no init): 512 If you navigate many routes and need data that was in your previously used controller, you just need to use GetBuilder Again (with no init):
495 513
496 -```dart 514 +``` dart
497 class OtherClass extends StatelessWidget { 515 class OtherClass extends StatelessWidget {
498 @override 516 @override
499 Widget build(BuildContext context) { 517 Widget build(BuildContext context) {
@@ -508,9 +526,9 @@ class OtherClass extends StatelessWidget { @@ -508,9 +526,9 @@ class OtherClass extends StatelessWidget {
508 526
509 ``` 527 ```
510 528
511 -If you need to use your controller in many other places, and outside of GetBuilder, just create a get in your controller and have it easily. (or use `Get.find<Controller>()`) 529 +If you need to use your controller in many other places, and outside of GetBuilder, just create a get in your controller and have it easily. (or use `Get.find<Controller>()` )
512 530
513 -```dart 531 +``` dart
514 class Controller extends GetxController { 532 class Controller extends GetxController {
515 533
516 /// You do not need that. I recommend using it just for ease of syntax. 534 /// You do not need that. I recommend using it just for ease of syntax.
@@ -529,7 +547,7 @@ class Controller extends GetxController { @@ -529,7 +547,7 @@ class Controller extends GetxController {
529 547
530 And then you can access your controller directly, that way: 548 And then you can access your controller directly, that way:
531 549
532 -```dart 550 +``` dart
533 FloatingActionButton( 551 FloatingActionButton(
534 onPressed: () { 552 onPressed: () {
535 Controller.to.increment(), 553 Controller.to.increment(),
@@ -544,7 +562,7 @@ When you press FloatingActionButton, all widgets that are listening to the 'coun @@ -544,7 +562,7 @@ When you press FloatingActionButton, all widgets that are listening to the 'coun
544 562
545 Let's say we have this: 563 Let's say we have this:
546 564
547 -`Class a => Class B (has controller X) => Class C (has controller X)` 565 + `Class a => Class B (has controller X) => Class C (has controller X)`
548 566
549 In class A the controller is not yet in memory, because you have not used it yet (Get is lazyLoad). In class B you used the controller, and it entered memory. In class C you used the same controller as in class B, Get will share the state of controller B with controller C, and the same controller is still in memory. If you close screen C and screen B, Get will automatically take controller X out of memory and free up resources, because Class a is not using the controller. If you navigate to B again, controller X will enter memory again, if instead of going to class C, you return to class A again, Get will take the controller out of memory in the same way. If class C didn't use the controller, and you took class B out of memory, no class would be using controller X and likewise it would be disposed of. The only exception that can mess with Get, is if you remove B from the route unexpectedly, and try to use the controller in C. In this case, the creator ID of the controller that was in B was deleted, and Get was programmed to remove it from memory every controller that has no creator ID. If you intend to do this, add the "autoRemove: false" flag to class B's GetBuilder and use adoptID = true; in class C's GetBuilder. 567 In class A the controller is not yet in memory, because you have not used it yet (Get is lazyLoad). In class B you used the controller, and it entered memory. In class C you used the same controller as in class B, Get will share the state of controller B with controller C, and the same controller is still in memory. If you close screen C and screen B, Get will automatically take controller X out of memory and free up resources, because Class a is not using the controller. If you navigate to B again, controller X will enter memory again, if instead of going to class C, you return to class A again, Get will take the controller out of memory in the same way. If class C didn't use the controller, and you took class B out of memory, no class would be using controller X and likewise it would be disposed of. The only exception that can mess with Get, is if you remove B from the route unexpectedly, and try to use the controller in C. In this case, the creator ID of the controller that was in B was deleted, and Get was programmed to remove it from memory every controller that has no creator ID. If you intend to do this, add the "autoRemove: false" flag to class B's GetBuilder and use adoptID = true; in class C's GetBuilder.
550 568
@@ -557,7 +575,7 @@ Unless you need to use a mixin, like TickerProviderStateMixin, it will be totall @@ -557,7 +575,7 @@ Unless you need to use a mixin, like TickerProviderStateMixin, it will be totall
557 You can call all methods of a StatefulWidget directly from a GetBuilder. 575 You can call all methods of a StatefulWidget directly from a GetBuilder.
558 If you need to call initState() or dispose() method for example, you can call them directly; 576 If you need to call initState() or dispose() method for example, you can call them directly;
559 577
560 -```dart 578 +``` dart
561 GetBuilder<Controller>( 579 GetBuilder<Controller>(
562 initState: (_) => Controller.to.fetchApi(), 580 initState: (_) => Controller.to.fetchApi(),
563 dispose: (_) => Controller.to.closeStreams(), 581 dispose: (_) => Controller.to.closeStreams(),
@@ -567,7 +585,7 @@ GetBuilder<Controller>( @@ -567,7 +585,7 @@ GetBuilder<Controller>(
567 585
568 A much better approach than this is to use the onInit() and onClose() method directly from your controller. 586 A much better approach than this is to use the onInit() and onClose() method directly from your controller.
569 587
570 -```dart 588 +``` dart
571 @override 589 @override
572 void onInit() { 590 void onInit() {
573 fetchApi(); 591 fetchApi();
@@ -575,7 +593,7 @@ void onInit() { @@ -575,7 +593,7 @@ void onInit() {
575 } 593 }
576 ``` 594 ```
577 595
578 -- NOTE: If you want to start a method at the moment the controller is called for the first time, you DON'T NEED to use constructors for this, in fact, using a performance-oriented package like Get, this borders on bad practice, because it deviates from the logic in which the controllers are created or allocated (if you create an instance of this controller, the constructor will be called immediately, you will be populating a controller before it is even used, you are allocating memory without it being in use, this definitely hurts the principles of this library). The onInit() methods; and onClose(); were created for this, they will be called when the Controller is created, or used for the first time, depending on whether you are using Get.lazyPut or not. If you want, for example, to make a call to your API to populate data, you can forget about the old-fashioned method of initState/dispose, just start your call to the api in onInit, and if you need to execute any command like closing streams, use the onClose() for that. 596 +* NOTE: If you want to start a method at the moment the controller is called for the first time, you DON'T NEED to use constructors for this, in fact, using a performance-oriented package like Get, this borders on bad practice, because it deviates from the logic in which the controllers are created or allocated (if you create an instance of this controller, the constructor will be called immediately, you will be populating a controller before it is even used, you are allocating memory without it being in use, this definitely hurts the principles of this library). The onInit() methods; and onClose(); were created for this, they will be called when the Controller is created, or used for the first time, depending on whether you are using Get.lazyPut or not. If you want, for example, to make a call to your API to populate data, you can forget about the old-fashioned method of initState/dispose, just start your call to the api in onInit, and if you need to execute any command like closing streams, use the onClose() for that.
579 597
580 ### Why it exists 598 ### Why it exists
581 599
@@ -587,7 +605,7 @@ You do not need to call the device, you have the onClose() method that will be c @@ -587,7 +605,7 @@ You do not need to call the device, you have the onClose() method that will be c
587 605
588 Do not call a dispose method inside GetxController, it will not do anything, remember that the controller is not a Widget, you should not "dispose" it, and it will be automatically and intelligently removed from memory by Get. If you used any stream on it and want to close it, just insert it into the close method. Example: 606 Do not call a dispose method inside GetxController, it will not do anything, remember that the controller is not a Widget, you should not "dispose" it, and it will be automatically and intelligently removed from memory by Get. If you used any stream on it and want to close it, just insert it into the close method. Example:
589 607
590 -```dart 608 +``` dart
591 class Controller extends GetxController { 609 class Controller extends GetxController {
592 StreamController<User> user = StreamController<User>(); 610 StreamController<User> user = StreamController<User>();
593 StreamController<String> name = StreamController<String>(); 611 StreamController<String> name = StreamController<String>();
@@ -604,15 +622,15 @@ class Controller extends GetxController { @@ -604,15 +622,15 @@ class Controller extends GetxController {
604 622
605 Controller life cycle: 623 Controller life cycle:
606 624
607 -- onInit() where it is created.  
608 -- onClose() where it is closed to make any changes in preparation for the delete method  
609 -- deleted: you do not have access to this API because it is literally removing the controller from memory. It is literally deleted, without leaving any trace. 625 +* onInit() where it is created.
  626 +* onClose() where it is closed to make any changes in preparation for the delete method
  627 +* deleted: you do not have access to this API because it is literally removing the controller from memory. It is literally deleted, without leaving any trace.
610 628
611 ### Other ways of using it 629 ### Other ways of using it
612 630
613 You can use Controller instance directly on GetBuilder value: 631 You can use Controller instance directly on GetBuilder value:
614 632
615 -```dart 633 +``` dart
616 GetBuilder<Controller>( 634 GetBuilder<Controller>(
617 init: Controller(), 635 init: Controller(),
618 builder: (value) => Text( 636 builder: (value) => Text(
@@ -623,7 +641,7 @@ GetBuilder<Controller>( @@ -623,7 +641,7 @@ GetBuilder<Controller>(
623 641
624 You may also need an instance of your controller outside of your GetBuilder, and you can use these approaches to achieve this: 642 You may also need an instance of your controller outside of your GetBuilder, and you can use these approaches to achieve this:
625 643
626 -```dart 644 +``` dart
627 class Controller extends GetxController { 645 class Controller extends GetxController {
628 static Controller get to => Get.find(); 646 static Controller get to => Get.find();
629 [...] 647 [...]
@@ -639,7 +657,7 @@ GetBuilder<Controller>( @@ -639,7 +657,7 @@ GetBuilder<Controller>(
639 657
640 or 658 or
641 659
642 -```dart 660 +``` dart
643 class Controller extends GetxController { 661 class Controller extends GetxController {
644 // static Controller get to => Get.find(); // with no static get 662 // static Controller get to => Get.find(); // with no static get
645 [...] 663 [...]
@@ -653,9 +671,9 @@ GetBuilder<Controller>( @@ -653,9 +671,9 @@ GetBuilder<Controller>(
653 ), 671 ),
654 ``` 672 ```
655 673
656 -- You can use "non-canonical" approaches to do this. If you are using some other dependency manager, like get_it, modular, etc., and just want to deliver the controller instance, you can do this: 674 +* You can use "non-canonical" approaches to do this. If you are using some other dependency manager, like get_it, modular, etc., and just want to deliver the controller instance, you can do this:
657 675
658 -```dart 676 +``` dart
659 Controller controller = Controller(); 677 Controller controller = Controller();
660 [...] 678 [...]
661 GetBuilder<Controller>( 679 GetBuilder<Controller>(
@@ -671,7 +689,7 @@ GetBuilder<Controller>( @@ -671,7 +689,7 @@ GetBuilder<Controller>(
671 689
672 If you want to refine a widget's update control with GetBuilder, you can assign them unique IDs: 690 If you want to refine a widget's update control with GetBuilder, you can assign them unique IDs:
673 691
674 -```dart 692 +``` dart
675 GetBuilder<Controller>( 693 GetBuilder<Controller>(
676 id: 'text' 694 id: 'text'
677 init: Controller(), // use it only first time on each controller 695 init: Controller(), // use it only first time on each controller
@@ -683,13 +701,13 @@ GetBuilder<Controller>( @@ -683,13 +701,13 @@ GetBuilder<Controller>(
683 701
684 And update it this form: 702 And update it this form:
685 703
686 -```dart 704 +``` dart
687 update(['text']); 705 update(['text']);
688 ``` 706 ```
689 707
690 You can also impose conditions for the update: 708 You can also impose conditions for the update:
691 709
692 -```dart 710 +``` dart
693 update(['text'], counter < 10); 711 update(['text'], counter < 10);
694 ``` 712 ```
695 713
@@ -701,6 +719,55 @@ Some people opened a feature request, as they wanted to use only one type of rea @@ -701,6 +719,55 @@ Some people opened a feature request, as they wanted to use only one type of rea
701 719
702 Extending GetxController is important, as they have life cycles, and can "start" and "end" events in their onInit() and onClose() methods. You can use any class for this, but I strongly recommend you use the GetxController class to place your variables, whether they are observable or not. 720 Extending GetxController is important, as they have life cycles, and can "start" and "end" events in their onInit() and onClose() methods. You can use any class for this, but I strongly recommend you use the GetxController class to place your variables, whether they are observable or not.
703 721
  722 +## StateMixin
  723 +
  724 +Another way to handle your `UI` state is use the `StateMixin<T>` .
  725 +To implement it, use the `with` to add the `StateMixin<T>`
  726 +to your controller which allows a T model.
  727 +
  728 +``` dart
  729 +class Controller extends GetController with StateMixin<User>{}
  730 +```
  731 +
  732 +The `change()` method change the State whenever we want.
  733 +Just pass the data and the status in this way:
  734 +
  735 +```dart
  736 +change(data, status: RxStatus.success());
  737 +```
  738 +
  739 +RxStatus allow these status:
  740 +
  741 +``` dart
  742 +RxStatus.loading();
  743 +RxStatus.success();
  744 +RxStatus.empty();
  745 +RxStatus.error('message');
  746 +```
  747 +
  748 +To represent it in the UI, use:
  749 +
  750 +```dart
  751 +class OtherClass extends GetView<Controller> {
  752 + @override
  753 + Widget build(BuildContext context) {
  754 + return Scaffold(
  755 +
  756 + body: controller.obx(
  757 + (state)=>Text(state.name),
  758 +
  759 + // here you can put your custom loading indicator, but
  760 + // by default would be Center(child:CircularProgressIndicator())
  761 + onLoading: CustomLoadingIndicator(),
  762 + onEmpty: Text('No data found'),
  763 +
  764 + // here also you can set your own error widget, but by
  765 + // default will be an Center(child:Text(error))
  766 + onError: (error)=>Text(error),
  767 + ),
  768 + );
  769 +}
  770 +```
704 771
705 ## GetBuilder vs GetX vs Obx vs MixinBuilder 772 ## GetBuilder vs GetX vs Obx vs MixinBuilder
706 773
@@ -242,7 +242,21 @@ Y en la segunda pantalla tome los datos por parámetro @@ -242,7 +242,21 @@ Y en la segunda pantalla tome los datos por parámetro
242 242
243 ```dart 243 ```dart
244 print(Get.parameters['user']); 244 print(Get.parameters['user']);
245 -// out: 34954 245 +// salida: 34954
  246 +```
  247 +
  248 +o envie multiples parametros de la siguiente manera
  249 +
  250 +```dart
  251 +Get.toNamed("/profile/34954?flag=true");
  252 +```
  253 +
  254 +En la segunda pantalla tome los parametros como lo haria normalmente
  255 +
  256 +```dart
  257 +print(Get.parameters['user']);
  258 +print(Get.parameters['flag']);
  259 +// salida: 34954 true
246 ``` 260 ```
247 261
248 Y ahora, todo lo que necesita hacer es usar Get.toNamed() para navegar por sus rutas nombradas, sin ningún contexto (puede llamar a sus rutas directamente desde su clase BLoC o Controller), y cuando su aplicación se compila para web, sus rutas aparecerán en la url del navegador <3 262 Y ahora, todo lo que necesita hacer es usar Get.toNamed() para navegar por sus rutas nombradas, sin ningún contexto (puede llamar a sus rutas directamente desde su clase BLoC o Controller), y cuando su aplicación se compila para web, sus rutas aparecerán en la url del navegador <3
@@ -312,7 +326,7 @@ class First extends StatelessWidget { @@ -312,7 +326,7 @@ class First extends StatelessWidget {
312 title: Text('First Route'), 326 title: Text('First Route'),
313 ), 327 ),
314 body: Center( 328 body: Center(
315 - child: RaisedButton( 329 + child: ElevatedButton(
316 child: Text('Open route'), 330 child: Text('Open route'),
317 onPressed: () { 331 onPressed: () {
318 Get.toNamed("/second"); 332 Get.toNamed("/second");
@@ -337,7 +351,7 @@ class Second extends StatelessWidget { @@ -337,7 +351,7 @@ class Second extends StatelessWidget {
337 title: Text('second Route'), 351 title: Text('second Route'),
338 ), 352 ),
339 body: Center( 353 body: Center(
340 - child: RaisedButton( 354 + child: ElevatedButton(
341 child: Text('Open route'), 355 child: Text('Open route'),
342 onPressed: () { 356 onPressed: () {
343 Get.toNamed("/third"); 357 Get.toNamed("/third");
@@ -356,7 +370,7 @@ class Third extends StatelessWidget { @@ -356,7 +370,7 @@ class Third extends StatelessWidget {
356 title: Text("Third Route"), 370 title: Text("Third Route"),
357 ), 371 ),
358 body: Center( 372 body: Center(
359 - child: RaisedButton( 373 + child: ElevatedButton(
360 onPressed: () { 374 onPressed: () {
361 Get.back(); 375 Get.back();
362 }, 376 },
@@ -427,7 +441,7 @@ Get.snackbar( @@ -427,7 +441,7 @@ Get.snackbar(
427 // Color leftBarIndicatorColor, 441 // Color leftBarIndicatorColor,
428 // List<BoxShadow> boxShadows, 442 // List<BoxShadow> boxShadows,
429 // Gradient backgroundGradient, 443 // Gradient backgroundGradient,
430 - // FlatButton mainButton, 444 + // TextButton mainButton,
431 // OnTap onTap, 445 // OnTap onTap,
432 // bool isDismissible, 446 // bool isDismissible,
433 // bool showProgressIndicator, 447 // bool showProgressIndicator,
@@ -484,12 +498,12 @@ Get.bottomSheet( @@ -484,12 +498,12 @@ Get.bottomSheet(
484 ListTile( 498 ListTile(
485 leading: Icon(Icons.music_note), 499 leading: Icon(Icons.music_note),
486 title: Text('Music'), 500 title: Text('Music'),
487 - onTap: () => {} 501 + onTap: () {}
488 ), 502 ),
489 ListTile( 503 ListTile(
490 leading: Icon(Icons.videocam), 504 leading: Icon(Icons.videocam),
491 title: Text('Video'), 505 title: Text('Video'),
492 - onTap: () => {}, 506 + onTap: () {},
493 ), 507 ),
494 ], 508 ],
495 ), 509 ),
@@ -519,7 +533,7 @@ Navigator( @@ -519,7 +533,7 @@ Navigator(
519 title: Text("Main"), 533 title: Text("Main"),
520 ), 534 ),
521 body: Center( 535 body: Center(
522 - child: FlatButton( 536 + child: TextButton(
523 color: Colors.blue, 537 color: Colors.blue,
524 onPressed: () { 538 onPressed: () {
525 Get.toNamed('/second', id:1); // navigate by your nested route by index 539 Get.toNamed('/second', id:1); // navigate by your nested route by index
  1 +# Gestion des dépendances
  2 +- [Gestion des dépendances](#Gestion-des-dépendances)
  3 + - [Instanciation des methodes](#Instanciation-des-methodes)
  4 + - [Get.put()](#getput)
  5 + - [Get.lazyPut](#getlazyput)
  6 + - [Get.putAsync](#getputasync)
  7 + - [Get.create](#getcreate)
  8 + - [Utilisation de méthodes/classes instanciées](#utilisation-de-mthodes-classes-instancies)
  9 + - [Différences entre les méthodes](#differences-entre-les-methodes)
  10 + - [Bindings](#bindings)
  11 + - [Classe Bindings](#classe-bindings)
  12 + - [BindingsBuilder](#bindingsbuilder)
  13 + - [SmartManagement](#smartmanagement)
  14 + - [Comment changer](#comment-changer)
  15 + - [SmartManagement.full](#smartmanagementfull)
  16 + - [SmartManagement.onlyBuilders](#smartmanagementonlybuilders)
  17 + - [SmartManagement.keepFactory](#smartmanagementkeepfactory)
  18 + - [Comment Bindings fonctionne sous le capot](#comment-bindings-fonctionne-sous-le-capot)
  19 + - [Notes](#notes)
  20 +
  21 +Get a un gestionnaire de dépendances simple et puissant qui vous permet de récupérer la même classe que votre Bloc ou Controller avec une seule ligne de code, pas de context Provider, pas d' inheritedWidget:
  22 +
  23 +```dart
  24 +Controller controller = Get.put(Controller()); // Au lieu de Controller controller = Controller();
  25 +```
  26 +
  27 +Au lieu d'instancier votre classe dans la classe que vous utilisez, vous l'instanciez dans l'instance Get, qui la rendra disponible dans toute votre application.
  28 +Vous pouvez donc utiliser votre contrôleur (ou classe Bloc) normalement
  29 +
  30 +- Note: Si vous utilisez le gestionnaire d'état de Get, faites plus attention à l'API [Bindings] (# bindings), qui facilitera la connexion de votre vue à votre contrôleur.
  31 +- Note²: La gestion des dépendances est découplée des autres parties du package, donc si, par exemple, votre application utilise déjà un gestionnaire d'état (n'importe lequel, peu importe), vous n'avez pas besoin de changer cela, vous pouvez utiliser ce manager d'injection de dépendance sans aucun problème.
  32 +
  33 +## Instanciation des methodes
  34 +Les méthodes et leurs paramètres configurables sont:
  35 +
  36 +### Get.put()
  37 +
  38 +La manière la plus courante d'insérer une dépendance. Bon pour les contrôleurs de vos vues par exemple.
  39 +
  40 +```dart
  41 +Get.put<SomeClass>(SomeClass());
  42 +Get.put<LoginController>(LoginController(), permanent: true);
  43 +Get.put<ListItemController>(ListItemController, tag: "un String unique");
  44 +```
  45 +
  46 +Ce sont toutes les options que vous pouvez définir lorsque vous utilisez put:
  47 +```dart
  48 +Get.put<S>(
  49 + // obligatoire: la classe que vous voulez que get enregistre, comme un 'controler' ou autre
  50 + // note: "S" signifie que ca peut etre une classe de n'importe quel type
  51 + S dependency
  52 +
  53 + // optionnel: c'est pour quand vous voulez plusieurs classes qui sont du même type
  54 + // puisque vous obtenez normalement une classe en utilisant Get.find<Controller>(),
  55 + // vous devez utiliser ce tag pour indiquer de quelle instance vous avez besoin
  56 + // doit être un String unique
  57 + String tag,
  58 +
  59 + // optionnel: par défaut, get supprimera les instances une fois qu'elles ne seront plus utilisées (exemple,
  60 + // le contrôleur d'une vue qui est fermée), mais vous pourriez avoir besoin que l'instance
  61 + // soit conservée dans toute l'application, comme une instance de sharedPreferences ou quelque chose du genre
  62 + // donc vous utilisez ceci
  63 + // équivaut à false par défaut
  64 + bool permanent = false,
  65 +
  66 + // facultatif: permet après avoir utilisé une classe abstraite dans un test, de la remplacer par une autre et de suivre le test.
  67 + // équivaut à false par défaut
  68 + bool overrideAbstract = false,
  69 +
  70 + // facultatif: vous permet de créer la dépendance en utilisant la fonction au lieu de la dépendance elle-même.
  71 + // ce n'est pas couramment utilisé
  72 + InstanceBuilderCallback<S> builder,
  73 +)
  74 +```
  75 +
  76 +### Get.lazyPut
  77 +Il est possible de lazyLoad une dépendance afin qu'elle ne soit instanciée que lorsqu'elle est utilisée. Très utile pour les classes qui demandent beaucoup de ressources ou si vous souhaitez instancier plusieurs classes en un seul endroit (comme dans une classe Bindings) et que vous savez que vous n'utiliserez pas cette classe à ce moment-là.
  78 +
  79 +```dart
  80 +/// ApiMock ne sera appelé que lorsque quelqu'un utilise Get.find <ApiMock> pour la première fois
  81 +Get.lazyPut<ApiMock>(() => ApiMock());
  82 +
  83 +Get.lazyPut<FirebaseAuth>(
  84 + () {
  85 + // ... some logic if needed
  86 + return FirebaseAuth();
  87 + },
  88 + tag: Math.random().toString(),
  89 + fenix: true
  90 +)
  91 +
  92 +Get.lazyPut<Controller>(() => Controller() )
  93 +```
  94 +
  95 +Ce sont toutes les options que vous pouvez définir lors de l'utilisation de lazyPut:
  96 +```dart
  97 +Get.lazyPut<S>(
  98 + // obligatoire: une méthode qui sera exécutée lorsque votre classe sera appelée pour la première fois
  99 + InstanceBuilderCallback builder,
  100 +
  101 + // facultatif: identique à Get.put(), il est utilisé lorsque vous voulez plusieurs instances différentes d'une même classe
  102 + // doit être unique
  103 + String tag,
  104 +
  105 + // facultatif: cela est similaire à "permanent", la différence est que l'instance est supprimée lorsqu'elle
  106 + // n'est pas utilisée, mais lorsqu'elle est à nouveau nécessaire, Get recrée l'instance
  107 + // identique à "SmartManagement.keepFactory" dans l'API Bindings
  108 + // vaut false par défaut
  109 + bool fenix = false
  110 +
  111 +)
  112 +```
  113 +
  114 +### Get.putAsync
  115 +Si vous souhaitez enregistrer une instance async, vous pouvez utiliser `Get.putAsync`:
  116 +
  117 +```dart
  118 +Get.putAsync<SharedPreferences>(() async {
  119 + final prefs = await SharedPreferences.getInstance();
  120 + await prefs.setInt('counter', 12345);
  121 + return prefs;
  122 +});
  123 +
  124 +Get.putAsync<YourAsyncClass>(() async => await YourAsyncClass())
  125 +```
  126 +
  127 +Ce sont toutes les options que vous pouvez définir lors de l'utilisation de putAsync:
  128 +```dart
  129 +Get.putAsync<S>(
  130 +
  131 + // obligatoire: une méthode async qui sera exécutée pour instancier votre classe
  132 + AsyncInstanceBuilderCallback<S> builder,
  133 +
  134 + // facultatif: identique à Get.put(), il est utilisé lorsque vous voulez plusieurs instances différentes d'une même classe
  135 + // doit être unique
  136 + String tag,
  137 +
  138 + // facultatif: identique à Get.put(), utilisé lorsque vous devez maintenir cette instance active dans l'ensemble de l'application
  139 + // vaut false par défaut
  140 + bool permanent = false
  141 +)
  142 +```
  143 +
  144 +### Get.create
  145 +
  146 +Celui-ci est délicat. Une explication détaillée de ce que c'est et des différences d'avec les autres peut être trouvée dans la section [Différences entre les méthodes:](#differences-entre-les-methodes).
  147 +
  148 +```dart
  149 +Get.Create<SomeClass>(() => SomeClass());
  150 +Get.Create<LoginController>(() => LoginController());
  151 +```
  152 +
  153 +Ce sont toutes les options que vous pouvez définir lors de l'utilisation de create:
  154 +
  155 +```dart
  156 +Get.create<S>(
  157 + // requis: une fonction qui renvoie une classe qui sera "fabriquée" chaque
  158 + // fois que `Get.find()` est appelé
  159 + // Exemple: Get.create<YourClass>(() => YourClass())
  160 + FcBuilderFunc<S> builder,
  161 +
  162 + // facultatif: comme Get.put(), mais il est utilisé lorsque vous avez besoin de plusieurs instances
  163 + // d'une même classe
  164 + // Utile dans le cas où vous avez une liste oú chaque élément a besoin de son propre contrôleur
  165 + // doit être une String unique. Changez simplement de 'tag' en 'name'
  166 + String name,
  167 +
  168 + // optionnel: tout comme dans `Get.put()`, c'est pour quand vous devez garder l'
  169 + // instance vivante dans toute l'application. La différence est que dans Get.create,
  170 + // permanent est 'true' par défaut
  171 + bool permanent = true
  172 +```
  173 +
  174 +## Utilisation de méthodes/classes instanciées
  175 +
  176 +Imaginez que vous ayez parcouru de nombreuses routes et que vous ayez besoin d'une donnée qui a été laissée dans votre contrôleur, vous auriez besoin d'un gestionnaire d'état combiné avec le 'Provider' ou Get_it, n'est-ce pas? Pas avec Get. Il vous suffit de demander à Get de "find" (trouver) votre contrôleur, vous n'avez pas besoin de dépendances supplémentaires:
  177 +
  178 +```dart
  179 +final controller = Get.find<Controller>();
  180 +// OR
  181 +Controller controller = Get.find();
  182 +
  183 +// Oui, cela ressemble à Magic, Get trouvera votre contrôleur et vous le livrera.
  184 +// Vous pouvez avoir 1 million de contrôleurs instanciés, Get vous trouvera toujours le bon contrôleur.
  185 +```
  186 +
  187 +Et puis vous pourrez récupérer les données de votre contrôleur qui ont été obtenues là-bas:
  188 +
  189 +```dart
  190 +Text(controller.textFromApi);
  191 +```
  192 +
  193 +La valeur renvoyée étant une classe normale, vous pouvez faire tout ce que vous voulez:
  194 +```dart
  195 +int count = Get.find<SharedPreferences>().getInt('counter');
  196 +print(count); // donne: 12345
  197 +```
  198 +
  199 +Pour supprimer une instance de Get:
  200 +
  201 +```dart
  202 +Get.delete<Controller>(); //généralement, vous n'avez pas besoin de le faire car GetX supprime déjà les contrôleurs inutilisés-
  203 +```
  204 +
  205 +## Differences entre les methodes
  206 +
  207 +Commençons par le `fenix` de Get.lazyPut et le `permanent` des autres méthodes.
  208 +
  209 +La différence fondamentale entre `permanent` et `fenix` réside dans la manière dont vous souhaitez stocker vos instances.
  210 +
  211 +Renforcement: par défaut, GetX supprime les instances lorsqu'elles ne sont pas utilisées.
  212 +Cela signifie que: Si l'écran 1 a le contrôleur 1 et l'écran 2 a le contrôleur 2 et que vous supprimez la première route du Stack, (comme si vous utilisez `Get.off()` ou `Get.offNamed()`) le contrôleur 1 a perdu son utilisation, il sera donc effacé.
  213 +
  214 +Mais si vous optez pour l'utilisation de `permanent: true`, alors le contrôleur ne sera pas perdu dans cette transition - ce qui est très utile pour les services que vous souhaitez maintenir actif dans toute l'application.
  215 +
  216 +`fenix`, quant à lui, est destiné aux services que vous ne craignez pas de perdre entre les changements d'écran, mais lorsque vous avez besoin de ce service, vous vous attendez à ce qu'il soit vivant. Donc, fondamentalement, il supprimera le contrôleur / service / classe inutilisé, mais lorsque vous en aurez besoin, il "recréera à partir de ses cendres" une nouvelle instance.
  217 +
  218 +Différences entre les méthodes:
  219 +
  220 +- Get.put et Get.putAsync suivent le même ordre de création, à la différence que la seconde utilise une méthode asynchrone: ces deux méthodes créent et initialisent l'instance. Celle-ci est insérée directement dans la mémoire, en utilisant la méthode interne `insert` avec les paramètres` permanent: false` et `isSingleton: true` (ce paramètre isSingleton a pour seul but de dire s'il faut utiliser la dépendance sur` dependency` ou s'il doit utiliser la dépendance sur `FcBuilderFunc`). Après cela, `Get.find()` est appelé pour initialiser immédiatement les instances qui sont en mémoire.
  221 +
  222 +- Get.create: Comme son nom l'indique, il "créera" votre dépendance! Similaire à `Get.put()`, il appelle également la méthode interne `insert` pour l'instanciation. Mais `permanent` devient vrai et` isSingleton` devient faux (puisque nous "créons" notre dépendance, il n'y a aucun moyen pour que ce soit une instance singleton, c'est pourquoi il est faux). Et comme il a `permanent: true`, nous avons par défaut l'avantage de ne pas le perdre entre les écrans! De plus, `Get.find()` n'est pas appelé immédiatement, il attend d'être utilisé dans l'écran pour être appelé. Il est créé de cette façon pour utiliser le paramètre `permanent`, depuis lors, il convient de noter que` Get.create() `a été créé dans le but de créer des instances non partagées, mais qui ne sont pas supprimées, comme par exemple un bouton dans un listView, pour lequel vous voulez une instance unique pour cette liste - à cause de cela, Get.create doit être utilisé avec GetWidget.
  223 +
  224 +- Get.lazyPut: Comme son nom l'indique, il s'agit d'un processus 'paresseux'. L'instance est créée, mais elle n'est pas appelée pour être utilisée immédiatement, elle reste en attente d'être appelée. Contrairement aux autres méthodes, `insert` n'est pas appelé ici. Au lieu de cela, l'instance est insérée dans une autre partie de la mémoire, une partie chargée de dire si l'instance peut être recréée ou non, appelons-la "factory". Si nous voulons créer quelque chose pour être utilisé plus tard, il ne sera pas mélangé avec les choses actuellement utilisées. Et voici où la magie de `fenix` apparaît: si vous choisissez de laisser` fenix: false`, et que votre `smartManagement` n'est pas` keepFactory`, alors lors de l'utilisation de `Get.find`, l'instance changera la place dans la mémoire de la "factory" à la zone de mémoire d'instance commune. Juste après cela, par défaut, il est retiré de `la factory`. Maintenant, si vous optez pour `fenix: true`, l'instance continue d'exister dans cette partie dédiée, allant même vers la zone commune, pour être appelée à nouveau dans le futur.
  225 +
  226 +## Bindings
  227 +
  228 +L'une des grandes différences de ce package, peut-être, est la possibilité d'une intégration complète des routes, du gestionnaire d'état et du gestionnaire de dépendances.
  229 +Lorsqu'une route est supprimée de la pile, tous les contrôleurs, variables et instances d'objets qui lui sont associés sont supprimés de la mémoire. Si vous utilisez des streams ou timers, ils seront fermés automatiquement et vous n'aurez à vous soucier de rien de tout cela.
  230 +Dans la version 2.10, Get a complètement implémenté l'API Bindings.
  231 +Vous n'avez plus besoin d'utiliser la méthode init. Vous n'avez même pas besoin de `typer`(declaration de type) vos contrôleurs si vous ne le souhaitez pas. Vous pouvez démarrer vos contrôleurs et services à l'endroit approprié pour cela.
  232 +La classe Binding est une classe qui découplera l'injection de dépendances, en faisant du "binding" des routes entre le gestionnaire d'état et le gestionnaire de dépendances.
  233 +Cela permet à Get de savoir quel écran est affiché lorsqu'un contrôleur particulier est utilisé et de savoir où et comment s'en débarrasser.
  234 +De plus, la classe Binding vous permettra d'avoir le contrôle de la configuration de SmartManager. Vous pouvez configurer les dépendances à organiser lors de la suppression d'une route du Stack, ou lorsque le widget qui l'utilisait est disposé, ou ni l'un ni l'autre. Vous disposerez d'une gestion intelligente des dépendances qui fonctionnera pour vous, mais vous pourrez malgré tout la configurer comme vous le souhaitez.
  235 +
  236 +### Classe Bindings
  237 +
  238 +- Créer une classe et implémenter Bindings
  239 +
  240 +```dart
  241 +class HomeBinding implements Bindings {}
  242 +```
  243 +
  244 +Votre IDE vous demandera automatiquement de remplacer la méthode "dependencies", et il vous suffit de cliquer sur la lampe, de remplacer la méthode et d'insérer toutes les classes que vous allez utiliser sur cette route:
  245 +
  246 +```dart
  247 +class HomeBinding implements Bindings {
  248 + @override
  249 + void dependencies() {
  250 + Get.lazyPut<HomeController>(() => HomeController());
  251 + Get.put<Service>(()=> Api());
  252 + }
  253 +}
  254 +
  255 +class DetailsBinding implements Bindings {
  256 + @override
  257 + void dependencies() {
  258 + Get.lazyPut<DetailsController>(() => DetailsController());
  259 + }
  260 +}
  261 +```
  262 +
  263 +Il vous suffit maintenant d'informer votre route, que vous utiliserez ce Binding pour établir la connexion entre le gestionnaire de routes, les dépendances et les états.
  264 +
  265 +- En utilisant les routes nommées:
  266 +
  267 +```dart
  268 +getPages: [
  269 + GetPage(
  270 + name: '/',
  271 + page: () => HomeView(),
  272 + binding: HomeBinding(),
  273 + ),
  274 + GetPage(
  275 + name: '/details',
  276 + page: () => DetailsView(),
  277 + binding: DetailsBinding(),
  278 + ),
  279 +];
  280 +```
  281 +
  282 +- En utilisant les routes normales:
  283 +
  284 +```dart
  285 +Get.to(Home(), binding: HomeBinding());
  286 +Get.to(DetailsView(), binding: DetailsBinding())
  287 +```
  288 +
  289 +Là, vous n'avez plus à vous soucier de la gestion de la mémoire de votre application, Get le fera pour vous.
  290 +
  291 +La classe Binding est appelée lorsqu'une route est appelée, vous pouvez créer un "initialBinding dans votre GetMaterialApp pour insérer toutes les dépendances qui seront créées.
  292 +
  293 +```dart
  294 +GetMaterialApp(
  295 + initialBinding: SampleBind(),
  296 + home: Home(),
  297 +);
  298 +```
  299 +
  300 +### BindingsBuilder
  301 +
  302 +La manière par défaut de créer un binding est de créer une classe qui implémente Bindings.
  303 +
  304 +Mais alternativement, vous pouvez utiliser le callback `BindingsBuilder` afin de pouvoir simplement utiliser une fonction pour instancier ce que vous désirez.
  305 +
  306 +Exemple:
  307 +
  308 +```dart
  309 +getPages: [
  310 + GetPage(
  311 + name: '/',
  312 + page: () => HomeView(),
  313 + binding: BindingsBuilder(() {
  314 + Get.lazyPut<ControllerX>(() => ControllerX());
  315 + Get.put<Service>(()=> Api());
  316 + }),
  317 + ),
  318 + GetPage(
  319 + name: '/details',
  320 + page: () => DetailsView(),
  321 + binding: BindingsBuilder(() {
  322 + Get.lazyPut<DetailsController>(() => DetailsController());
  323 + }),
  324 + ),
  325 +];
  326 +```
  327 +
  328 +De cette façon, vous pouvez éviter de créer une classe Binding pour chaque route, ce qui est encore plus simple.
  329 +
  330 +Les deux méthodes fonctionnent parfaitement bien et nous voulons que vous utilisiez ce qui correspond le mieux à vos goûts.
  331 +
  332 +### SmartManagement
  333 +
  334 +GetX par défaut supprime les contrôleurs inutilisés de la mémoire, même si un échec se produit et qu'un widget qui l'utilise n'est pas correctement supprimé.
  335 +C'est ce qu'on appelle le mode `full` de gestion des dépendances.
  336 +Mais si vous voulez changer la façon dont GetX contrôle la suppression des classes, vous avez la classe `SmartManagement` pour définir différents comportements.
  337 +
  338 +#### Comment changer
  339 +
  340 +Si vous souhaitez modifier cette configuration (dont vous n'avez généralement pas besoin), procédez comme suit:
  341 +
  342 +```dart
  343 +void main () {
  344 + runApp(
  345 + GetMaterialApp(
  346 + smartManagement: SmartManagement.onlyBuilders //Ici
  347 + home: Home(),
  348 + )
  349 + )
  350 +}
  351 +```
  352 +
  353 +#### SmartManagement.full
  354 +
  355 +C'est celui par défaut. Supprime les classes qui ne sont pas utilisées et qui n'ont pas été définies pour être permanentes. Dans la majorité des cas, vous voudrez garder cette configuration intacte. Si vous débutez avec GetX, ne changez pas cela.
  356 +
  357 +#### SmartManagement.onlyBuilders
  358 +
  359 +Avec cette option, seuls les contrôleurs démarrés dans `init:` ou chargés dans un Binding avec `Get.lazyPut()` seront supprimés.
  360 +
  361 +Si vous utilisez `Get.put()` ou `Get.putAsync()` ou toute autre approche, SmartManagement n'aura pas les autorisations pour exclure cette dépendance.
  362 +
  363 +Avec le comportement par défaut, même les widgets instanciés avec "Get.put" seront supprimés, contrairement à SmartManagement.onlyBuilders.
  364 +
  365 +#### SmartManagement.keepFactory
  366 +
  367 +Tout comme SmartManagement.full, il supprimera ses dépendances lorsqu'elles ne seront plus utilisées. Cependant, il conservera leur factory, ce qui signifie qu'il recréera la dépendance si vous avez à nouveau besoin de cette instance.
  368 +
  369 +### Comment Bindings fonctionne sous le capot
  370 +
  371 +Bindings crée des `'factories' transitoires`, qui sont créées au moment où vous cliquez pour aller à un autre écran, et seront détruites dès que l'animation de changement d'écran se produit.
  372 +Cela arrive si vite que l'analyseur ne pourra même pas l'enregistrer.
  373 +Lorsque vous accédez à nouveau à cet écran, une nouvelle fabrique temporaire sera appelée, c'est donc préférable à l'utilisation de SmartManagement.keepFactory, mais si vous ne voulez pas créer de Bindings, ou si vous voulez garder toutes vos dépendances sur le même Binding , cela vous aidera certainement.
  374 +Les factories prennent peu de mémoire, elles ne contiennent pas d'instances, mais une fonction avec la "forme" de cette classe que vous voulez.
  375 +Cela a un très faible coût en mémoire, mais comme le but de cette bibliothèque est d'obtenir le maximum de performances possible en utilisant le minimum de ressources, Get supprime même les factories par défaut.
  376 +Utilisez celui qui vous convient le mieux.
  377 +
  378 +## Notes
  379 +
  380 +- N'UTILISEZ PAS SmartManagement.keepFactory si vous utilisez plusieurs Bindings. Il a été conçu pour être utilisé sans Bindings ou avec une seule Binding liée dans le fichier initialBinding de GetMaterialApp.
  381 +
  382 +- L'utilisation de Bindings est complètement facultative, si vous le souhaitez, vous pouvez utiliser `Get.put()` et `Get.find()` sur les classes qui utilisent un contrôleur donné sans aucun problème.
  383 + Cependant, si vous travaillez avec des services ou toute autre abstraction, je vous recommande d'utiliser Bindings pour une meilleure organisation.
  1 +- [Gestion de route](#gestion-de-route)
  2 + - [Utilisation](#utilisation)
  3 + - [Navigation sans nom](#navigation-sans-nom)
  4 + - [Navigation par nom](#navigation-par-nom)
  5 + - [Envoyer des données aux routes nommées](#envoyer-des-donnes-aux-routes-nommes)
  6 + - [Liens URL dynamiques](#liens-url-dynamiques)
  7 + - [Middleware](#middleware)
  8 + - [Navigation sans context](#navigation-sans-context)
  9 + - [SnackBars](#snackbars)
  10 + - [Dialogs](#dialogs)
  11 + - [BottomSheets](#bottomsheets)
  12 + - [Nested Navigation](#nested-navigation)
  13 +
  14 +# Gestion de route
  15 +
  16 +C'est l'explication complète de tout ce qu'il y a à savoir sur Getx quand il s'agit de la gestion des routes.
  17 +
  18 +## Utilisation
  19 +
  20 +Ajoutez ceci à votre fichier pubspec.yaml:
  21 +
  22 +```yaml
  23 +dependencies:
  24 + get:
  25 +```
  26 +
  27 +Si vous allez utiliser des routes/snackbars/dialogs/bottomsheets sans contexte, ou utiliser les API Get de haut niveau, vous devez simplement ajouter "Get" avant votre MaterialApp, en le transformant en GetMaterialApp et en profiter!
  28 +
  29 +```dart
  30 +GetMaterialApp( // Avant: MaterialApp(
  31 + home: MyHome(),
  32 +)
  33 +```
  34 +
  35 +## Navigation sans nom
  36 +
  37 +Pour accéder à un nouvel écran:
  38 +
  39 +```dart
  40 +Get.to(NextScreen());
  41 +```
  42 +
  43 +To close snackbars, dialogs, bottomsheets, or anything you would normally close with Navigator.pop(context);
  44 +Pour fermer les snackbars, dialogs, bottomsheets ou tout ce que vous fermez normalement avec Navigator.pop (context);
  45 +
  46 +```dart
  47 +Get.back();
  48 +```
  49 +
  50 +Pour aller à l'écran suivant et aucune option pour revenir à l'écran précédent (pour une utilisation dans SplashScreens, écrans de connexion, etc.)
  51 +
  52 +```dart
  53 +Get.off(NextScreen());
  54 +```
  55 +
  56 +Pour aller à l'écran suivant et annuler toutes les routes précédents (utile dans les paniers d'achat e-commerce, les sondages et les tests)
  57 +
  58 +```dart
  59 +Get.offAll(NextScreen());
  60 +```
  61 +
  62 +Pour naviguer vers l'écran suivant et recevoir ou mettre à jour des données dès que vous en revenez:
  63 +
  64 +```dart
  65 +var data = await Get.to(Payment());
  66 +```
  67 +
  68 +sur l'autre écran, envoyez les données pour l'écran précédent:
  69 +
  70 +```dart
  71 +Get.back(result: 'success');
  72 +```
  73 +
  74 +Et utilisez-les:
  75 +
  76 +ex:
  77 +
  78 +```dart
  79 +if(data == 'success') madeAnything();
  80 +```
  81 +
  82 +Vous ne voulez pas apprendre notre syntaxe?
  83 +Changez simplement le Navigateur (majuscule) en navigateur (minuscule), et vous aurez toutes les fonctions de la navigation standard, sans avoir à utiliser 'context'.
  84 +Exemple:
  85 +
  86 +```dart
  87 +
  88 +// Navigateur Flutter par défaut
  89 +Navigator.of(context).push(
  90 + context,
  91 + MaterialPageRoute(
  92 + builder: (BuildContext context) {
  93 + return HomePage();
  94 + },
  95 + ),
  96 +);
  97 +
  98 +// Utilisez la syntaxe Flutter sans avoir besoin de 'context'
  99 +navigator.push(
  100 + MaterialPageRoute(
  101 + builder: (_) {
  102 + return HomePage();
  103 + },
  104 + ),
  105 +);
  106 +
  107 +// Syntaxe Get (c'est beaucoup mieux, mais vous avez le droit d'être en désaccord)
  108 +Get.to(HomePage());
  109 +
  110 +
  111 +```
  112 +
  113 +## Navigation Par Nom
  114 +
  115 +- Si vous préférez naviguer par namedRoutes, Get prend également en charge cela.
  116 +
  117 +Pour aller à nextScreen
  118 +
  119 +```dart
  120 +Get.toNamed("/NextScreen");
  121 +```
  122 +
  123 +Pour naviguer et supprimer l'écran précédent du stack.
  124 +
  125 +```dart
  126 +Get.offNamed("/NextScreen");
  127 +```
  128 +
  129 +Pour naviguer et supprimer tous les écrans précédents du stack.
  130 +
  131 +```dart
  132 +Get.offAllNamed("/NextScreen");
  133 +```
  134 +
  135 +Pour définir des routes, utilisez GetMaterialApp:
  136 +
  137 +```dart
  138 +void main() {
  139 + runApp(
  140 + GetMaterialApp(
  141 + initialRoute: '/',
  142 + getPages: [
  143 + GetPage(name: '/', page: () => MyHomePage()),
  144 + GetPage(name: '/second', page: () => Second()),
  145 + GetPage(
  146 + name: '/third',
  147 + page: () => Third(),
  148 + transition: Transition.zoom
  149 + ),
  150 + ],
  151 + )
  152 + );
  153 +}
  154 +```
  155 +
  156 +Pour gérer la navigation vers des routes non définies (erreur 404), vous pouvez définir une page 'unknownRoute' dans GetMaterialApp.
  157 +
  158 +```dart
  159 +void main() {
  160 + runApp(
  161 + GetMaterialApp(
  162 + unknownRoute: GetPage(name: '/notfound', page: () => UnknownRoutePage()),
  163 + initialRoute: '/',
  164 + getPages: [
  165 + GetPage(name: '/', page: () => MyHomePage()),
  166 + GetPage(name: '/second', page: () => Second()),
  167 + ],
  168 + )
  169 + );
  170 +}
  171 +```
  172 +
  173 +### Envoyer des données aux routes nommées
  174 +
  175 +Envoyez simplement ce que vous voulez comme arguments. Get accepte n'importe quoi ici, qu'il s'agisse d'une String, d'une Map, d'une List ou même d'une instance de classe.
  176 +
  177 +```dart
  178 +Get.toNamed("/NextScreen", arguments: 'Get is the best');
  179 +```
  180 +
  181 +dans votre classe ou contrôleur:
  182 +
  183 +```dart
  184 +print(Get.arguments);
  185 +//montre: Get is the best
  186 +```
  187 +
  188 +### Liens URL dynamiques
  189 +
  190 +Get propose des URL dynamiques avancées, tout comme sur le Web. Les développeurs Web ont probablement déjà voulu cette fonctionnalité sur Flutter, et ont très probablement vu un package promettre cette fonctionnalité et fournir une syntaxe totalement différente de celle d'une URL sur le Web, mais Get résout également cela.
  191 +
  192 +```dart
  193 +Get.offAllNamed("/NextScreen?device=phone&id=354&name=Enzo");
  194 +```
  195 +
  196 +sur votre classe controller/bloc/stateful/stateless:
  197 +
  198 +```dart
  199 +print(Get.parameters['id']);
  200 +// donne: 354
  201 +print(Get.parameters['name']);
  202 +// donne: Enzo
  203 +```
  204 +
  205 +Vous pouvez également recevoir facilement des paramètres nommés avec Get:
  206 +
  207 +```dart
  208 +void main() {
  209 + runApp(
  210 + GetMaterialApp(
  211 + initialRoute: '/',
  212 + getPages: [
  213 + GetPage(
  214 + name: '/',
  215 + page: () => MyHomePage(),
  216 + ),
  217 + GetPage(
  218 + name: '/profile/',
  219 + page: () => MyProfile(),
  220 + ),
  221 + //Vous pouvez définir une page différente pour les routes avec arguments, et une autre sans arguments, mais pour cela vous devez utiliser la barre oblique '/' sur la route qui ne recevra pas d'arguments comme ci-dessus.
  222 + GetPage(
  223 + name: '/profile/:user',
  224 + page: () => UserProfile(),
  225 + ),
  226 + GetPage(
  227 + name: '/third',
  228 + page: () => Third(),
  229 + transition: Transition.cupertino
  230 + ),
  231 + ],
  232 + )
  233 + );
  234 +}
  235 +```
  236 +
  237 +Envoyer des données sur le nom de la route
  238 +
  239 +```dart
  240 +Get.toNamed("/profile/34954");
  241 +```
  242 +
  243 +Sur le deuxième écran, recevez les données par paramètre
  244 +
  245 +```dart
  246 +print(Get.parameters['user']);
  247 +// donne: 34954
  248 +```
  249 +
  250 +ou envoyer plusieurs paramètres comme celui-ci
  251 +
  252 +```dart
  253 +Get.toNamed("/profile/34954?flag=true");
  254 +```
  255 +
  256 +Sur le deuxième écran, prenez les données par paramètres comme d'habitude
  257 +
  258 +```dart
  259 +print(Get.parameters['user']);
  260 +print(Get.parameters['flag']);
  261 +// donne: 34954 true
  262 +```
  263 +
  264 +Et maintenant, tout ce que vous avez à faire est d'utiliser Get.toNamed() pour parcourir vos routes nommées, sans aucun contexte (vous pouvez appeler vos routes directement à partir de votre classe BLoC ou Controller), et lorsque votre application est compilée sur le Web, vos routes apparaîtront dans l'url <3
  265 +
  266 +### Middleware
  267 +
  268 +Si vous souhaitez écouter les événements Get pour déclencher des actions, vous pouvez utiliser routingCallback pour le faire:
  269 +
  270 +```dart
  271 +GetMaterialApp(
  272 + routingCallback: (routing) {
  273 + if(routing.current == '/second'){
  274 + openAds();
  275 + }
  276 + }
  277 +)
  278 +```
  279 +
  280 +Si vous n'utilisez pas GetMaterialApp, vous pouvez utiliser l'API manuelle pour attacher l'observateur Middleware.
  281 +
  282 +```dart
  283 +void main() {
  284 + runApp(
  285 + MaterialApp(
  286 + onGenerateRoute: Router.generateRoute,
  287 + initialRoute: "/",
  288 + navigatorKey: Get.key,
  289 + navigatorObservers: [
  290 + GetObserver(MiddleWare.observer), // ICI !!!
  291 + ],
  292 + ),
  293 + );
  294 +}
  295 +```
  296 +
  297 +Créez une classe MiddleWare
  298 +
  299 +```dart
  300 +class MiddleWare {
  301 + static observer(Routing routing) {
  302 + /// Vous pouvez écouter en plus des routes, des snackbars, des dialogs et des bottomsheets sur chaque écran.
  303 + /// Si vous devez saisir l'un de ces 3 événements directement ici,
  304 + /// vous devez spécifier que l'événement est != Ce que vous essayez de faire.
  305 + if (routing.current == '/second' && !routing.isSnackbar) {
  306 + Get.snackbar("Hi", "You are on second route");
  307 + } else if (routing.current =='/third'){
  308 + print('dernière route');
  309 + }
  310 + }
  311 +}
  312 +```
  313 +
  314 +Maintenant, utilisez Get sur votre code:
  315 +
  316 +```dart
  317 +class First extends StatelessWidget {
  318 + @override
  319 + Widget build(BuildContext context) {
  320 + return Scaffold(
  321 + appBar: AppBar(
  322 + leading: IconButton(
  323 + icon: Icon(Icons.add),
  324 + onPressed: () {
  325 + Get.snackbar("hi", "i am a modern snackbar");
  326 + },
  327 + ),
  328 + title: Text('First Route'),
  329 + ),
  330 + body: Center(
  331 + child: ElevatedButton(
  332 + child: Text('Open route'),
  333 + onPressed: () {
  334 + Get.toNamed("/second");
  335 + },
  336 + ),
  337 + ),
  338 + );
  339 + }
  340 +}
  341 +
  342 +class Second extends StatelessWidget {
  343 + @override
  344 + Widget build(BuildContext context) {
  345 + return Scaffold(
  346 + appBar: AppBar(
  347 + leading: IconButton(
  348 + icon: Icon(Icons.add),
  349 + onPressed: () {
  350 + Get.snackbar("hi", "i am a modern snackbar");
  351 + },
  352 + ),
  353 + title: Text('second Route'),
  354 + ),
  355 + body: Center(
  356 + child: ElevatedButton(
  357 + child: Text('Open route'),
  358 + onPressed: () {
  359 + Get.toNamed("/third");
  360 + },
  361 + ),
  362 + ),
  363 + );
  364 + }
  365 +}
  366 +
  367 +class Third extends StatelessWidget {
  368 + @override
  369 + Widget build(BuildContext context) {
  370 + return Scaffold(
  371 + appBar: AppBar(
  372 + title: Text("Third Route"),
  373 + ),
  374 + body: Center(
  375 + child: ElevatedButton(
  376 + onPressed: () {
  377 + Get.back();
  378 + },
  379 + child: Text('Go back!'),
  380 + ),
  381 + ),
  382 + );
  383 + }
  384 +}
  385 +```
  386 +
  387 +## Navigation sans context
  388 +
  389 +### SnackBars
  390 +
  391 +Pour avoir un simple SnackBar avec Flutter, vous devez obtenir le 'context' de Scaffold, ou vous devez utiliser un GlobalKey attaché à votre Scaffold
  392 +
  393 +```dart
  394 +final snackBar = SnackBar(
  395 + content: Text('Hi!'),
  396 + action: SnackBarAction(
  397 + label: 'I am a old and ugly snackbar :(',
  398 + onPressed: (){}
  399 + ),
  400 +);
  401 +// Trouvez le scaffold dans l'arborescence des widgets et utilisez-le pour afficher un SnackBar.
  402 +Scaffold.of(context).showSnackBar(snackBar);
  403 +```
  404 +
  405 +Avec Get:
  406 +
  407 +```dart
  408 +Get.snackbar('Hi', 'i am a modern snackbar');
  409 +```
  410 +
  411 +Avec Get, tout ce que vous avez à faire est d'appeler votre Get.snackbar à partir de n'importe où dans votre code ou de le personnaliser comme vous le souhaitez!
  412 +
  413 +```dart
  414 +Get.snackbar(
  415 + "Hey i'm a Get SnackBar!", // title
  416 + "C'est incroyable! J'utilise SnackBar sans context, sans code standard, sans Scaffold, c'est quelque chose de vraiment incroyable!", // message
  417 + icon: Icon(Icons.alarm),
  418 + shouldIconPulse: true,
  419 + onTap:(){},
  420 + barBlur: 20,
  421 + isDismissible: true,
  422 + duration: Duration(seconds: 3),
  423 +);
  424 +
  425 +
  426 + ////////// TOUTES LES FONCTIONNALITÉS //////////
  427 + // Color colorText,
  428 + // Duration duration,
  429 + // SnackPosition snackPosition,
  430 + // Widget titleText,
  431 + // Widget messageText,
  432 + // bool instantInit,
  433 + // Widget icon,
  434 + // bool shouldIconPulse,
  435 + // double maxWidth,
  436 + // EdgeInsets margin,
  437 + // EdgeInsets padding,
  438 + // double borderRadius,
  439 + // Color borderColor,
  440 + // double borderWidth,
  441 + // Color backgroundColor,
  442 + // Color leftBarIndicatorColor,
  443 + // List<BoxShadow> boxShadows,
  444 + // Gradient backgroundGradient,
  445 + // TextButton mainButton,
  446 + // OnTap onTap,
  447 + // bool isDismissible,
  448 + // bool showProgressIndicator,
  449 + // AnimationController progressIndicatorController,
  450 + // Color progressIndicatorBackgroundColor,
  451 + // Animation<Color> progressIndicatorValueColor,
  452 + // SnackStyle snackStyle,
  453 + // Curve forwardAnimationCurve,
  454 + // Curve reverseAnimationCurve,
  455 + // Duration animationDuration,
  456 + // double barBlur,
  457 + // double overlayBlur,
  458 + // Color overlayColor,
  459 + // Form userInputForm
  460 + ///////////////////////////////////
  461 +```
  462 +
  463 +Si vous préférez le snack-bar traditionnel, ou souhaitez le personnaliser à partir de zéro, y compris en ajoutant une seule ligne (Get.snackbar utilise un titre et un message obligatoires), vous pouvez utiliser
  464 +`Get.rawSnackbar ();` qui fournit l'API brute sur laquelle Get.snackbar a été construit.
  465 +
  466 +### Dialogs
  467 +
  468 +Pour ouvrir un 'dialog':
  469 +
  470 +```dart
  471 +Get.dialog(VotreDialogWidget());
  472 +```
  473 +
  474 +Pour ouvrir le 'dialog' par défaut:
  475 +
  476 +```dart
  477 +Get.defaultDialog(
  478 + onConfirm: () => print("Ok"),
  479 + middleText: "Dialog made in 3 lines of code"
  480 +);
  481 +```
  482 +
  483 +Vous pouvez également utiliser Get.generalDialog au lieu de showGeneralDialog.
  484 +
  485 +Pour tous les autres widgets de la boîte de dialogue Flutter, y compris cupertinos, vous pouvez utiliser Get.overlayContext au lieu du context et l'ouvrir n'importe où dans votre code.
  486 +Pour les widgets qui n'utilisent pas Overlay, vous pouvez utiliser Get.context.
  487 +Ces deux contextes fonctionneront dans 99% des cas pour remplacer le context de votre interface utilisateur, sauf dans les cas où inheritedWidget est utilisé sans context de navigation.
  488 +
  489 +### BottomSheets
  490 +
  491 +Get.bottomSheet est comme showModalBottomSheet, mais n'a pas besoin de 'context'.
  492 +
  493 +```dart
  494 +Get.bottomSheet(
  495 + Container(
  496 + child: Wrap(
  497 + children: <Widget>[
  498 + ListTile(
  499 + leading: Icon(Icons.music_note),
  500 + title: Text('Music'),
  501 + onTap: () {}
  502 + ),
  503 + ListTile(
  504 + leading: Icon(Icons.videocam),
  505 + title: Text('Video'),
  506 + onTap: () {},
  507 + ),
  508 + ],
  509 + ),
  510 + )
  511 +);
  512 +```
  513 +
  514 +## Nested Navigation
  515 +
  516 +Getx a rendu la navigation imbriquée de Flutter encore plus facile.
  517 +Vous n'avez pas besoin de 'context' et vous trouverez votre stack de navigation par ID.
  518 +
  519 +- NOTE: La création de stacks de navigation parallèles peut être dangereuse. L'idéal est de ne pas utiliser NestedNavigators, ou de l'utiliser avec parcimonie. Si votre projet l'exige, allez-y, mais gardez à l'esprit que conserver plusieurs stacks de navigation en mémoire n'est peut-être pas une bonne idée pour la consommation de RAM.
  520 +
  521 +Voyez comme c'est simple:
  522 +
  523 +```dart
  524 +Navigator(
  525 + key: Get.nestedKey(1), // créez une clé par index
  526 + initialRoute: '/',
  527 + onGenerateRoute: (settings) {
  528 + if (settings.name == '/') {
  529 + return GetPageRoute(
  530 + page: () => Scaffold(
  531 + appBar: AppBar(
  532 + title: Text("Main"),
  533 + ),
  534 + body: Center(
  535 + child: TextButton(
  536 + color: Colors.blue,
  537 + onPressed: () {
  538 + Get.toNamed('/second', id:1); // naviguer votre itinéraire imbriqué par index
  539 + },
  540 + child: Text("Go to second"),
  541 + ),
  542 + ),
  543 + ),
  544 + );
  545 + } else if (settings.name == '/second') {
  546 + return GetPageRoute(
  547 + page: () => Center(
  548 + child: Scaffold(
  549 + appBar: AppBar(
  550 + title: Text("Main"),
  551 + ),
  552 + body: Center(
  553 + child: Text("second")
  554 + ),
  555 + ),
  556 + ),
  557 + );
  558 + }
  559 + }
  560 +),
  561 +```
  1 +- [Gestion d'État](#gestion-d-etat)
  2 + - [Gestionnaire d'état réactif](#gestionnaire-d-etat-reactif)
  3 + - [Avantages](#avantages)
  4 + - [Performance maximale:](#performance-maximale)
  5 + - [Déclaration d'une variable réactive](#declaration-d-une-variable-reactive)
  6 + - [Avoir un état réactif, c'est facile.](#avoir-un-etat-reactif-c-est-facile)
  7 + - [Utilisation des valeurs dans la Vue](#utilisation-des-valeurs-dans-la-vue)
  8 + - [Conditions pour reconstruire](#conditions-pour-reconstruire)
  9 + - [Quand utiliser .obs](#quand-utiliser-obs)
  10 + - [Remarque sur List](#remarque-sur-list)
  11 + - [Pourquoi je dois utiliser .value](#pourquoi-je-dois-utiliser-value)
  12 + - [Obx()](#obx)
  13 + - [Workers](#workers)
  14 + - [Gestionnaire d'état simple](#gestionnaire-d-etat-simple)
  15 + - [Atouts](#atouts)
  16 + - [Utilisation](#utilisation)
  17 + - [Comment il gère les contrôleurs](#comment-il-gre-les-contrleurs)
  18 + - [Vous n'aurez plus besoin de StatefulWidgets](#vous-naurez-plus-besoin-de-statefulwidgets)
  19 + - [Pourquoi ça existe](#pourquoi-ca-existe)
  20 + - [Autres façons de l'utiliser](#autres-formes-d-utilisation)
  21 + - [IDs Uniques](#ids-uniques)
  22 + - [Mélanger les deux gestionnaires d'état](#mixing-the-two-state-managers)
  23 + - [GetBuilder vs GetX vs Obx vs MixinBuilder](#getbuilder-vs-getx-vs-obx-vs-mixinbuilder)
  24 +
  25 +# Gestion d Etat
  26 +
  27 +GetX n'utilise pas Streams ou ChangeNotifier comme les autres gestionnaires d'état. Pourquoi? En plus de créer des applications pour Android, iOS, Web, Linux, MacOS et Linux, GetX vous permet de créer des applications serveur avec la même syntaxe que Flutter / GetX. Afin d'améliorer le temps de réponse et de réduire la consommation de RAM, nous avons créé GetValue et GetStream, des solutions à faible latence qui offrent beaucoup de performances, à un faible coût d'exploitation. Nous utilisons cette base pour construire toutes nos ressources, y compris la gestion d'état.
  28 +
  29 +- _Complexité_: Certains gestionnaires d'État sont complexes et ont beaucoup de code standard. Avec GetX, vous n'avez pas à définir une classe pour chaque événement, le code est très propre et clair, et vous faites beaucoup plus en écrivant moins. Beaucoup de gens ont abandonné Flutter à cause de ce sujet, et ils ont enfin une solution stupidement simple pour gérer les états.
  30 +- _Aucun générateur de code_: Vous passez la moitié de votre temps de développement à écrire la logique de votre application. Certains gestionnaires d'état s'appuient sur des générateurs de code pour avoir un code lisible minimal. Changer une variable et avoir à exécuter build_runner peut être improductif, et souvent le temps d'attente après un redémarrage sera long, et vous devrez boire beaucoup de café.
  31 + Avec GetX, tout est réactif, et rien ne dépend des générateurs de code, augmentant votre productivité dans tous les aspects de votre développement.
  32 +- _Cela ne dépend pas de 'context'_: Vous avez probablement déjà eu besoin d'envoyer le contexte de votre vue à un contrôleur, ce qui rend le couplage de la vue avec votre logique métier élevé. Vous avez probablement dû utiliser une dépendance dans un endroit qui n'a pas de contexte, et avez dû passer le contexte à travers différentes classes et fonctions. Cela n'existe tout simplement pas avec GetX. Vous avez accès à vos contrôleurs depuis vos contrôleurs sans aucun contexte. Vous n'avez pas besoin d'envoyer le contexte par paramètre pour rien.
  33 +- _Contrôle granulaire_: la plupart des gestionnaires d'état sont basés sur ChangeNotifier. ChangeNotifier notifiera tous les widgets qui en dépendent lors de l'appel de notifyListeners. Si vous avez 40 widgets sur un écran, qui ont une variable de votre classe ChangeNotifier, lorsque vous en mettez un à jour, tous seront reconstruits.
  34 + Avec GetX, même les widgets imbriqués sont respectés. Si Obx gère votre ListView et un autre gère une case à cocher dans ListView, lors de la modification de la valeur CheckBox, il ne sera mis à jour que, lors de la modification de la valeur List, seul le ListView sera mis à jour.
  35 +- _Il ne reconstruit que si sa variable change VRAIMENT_: GetX a un contrôle de flux, cela signifie que si vous affichez un texte avec 'Paola', si vous changez à nouveau la variable observable en 'Paola', le widget ne sera pas reconstruit. C'est parce que GetX sait que `Paola` est déjà affiché dans Text et ne fera pas de reconstructions inutiles.
  36 + La plupart (sinon tous) les gestionnaires d'état actuels se reconstruiront à l'écran.
  37 +
  38 +## Gestionnaire d etat reactif
  39 +
  40 +La programmation réactive peut aliéner de nombreuses personnes car on dit qu'elle est compliquée. GetX transforme la programmation réactive en quelque chose d'assez simple:
  41 +
  42 +- Vous n'aurez pas besoin de créer des StreamControllers.
  43 +- Vous n'aurez pas besoin de créer un StreamBuilder pour chaque variable
  44 +- Vous n'aurez pas besoin de créer une classe pour chaque état.
  45 +- Vous n'aurez pas besoin de créer un 'get' pour une valeur initiale.
  46 +
  47 +
  48 +La programmation réactive avec Get est aussi simple que d'utiliser setState.
  49 +
  50 +Imaginons que vous ayez une variable de 'name' et que vous souhaitiez que chaque fois que vous la modifiez, tous les widgets qui l'utilisent soient automatiquement modifiés.
  51 +
  52 +Voici votre variable:
  53 +
  54 +```dart
  55 +var name = 'Jonatas Borges';
  56 +```
  57 +
  58 +Pour la rendre observable, il vous suffit d'ajouter ".obs" à la fin:
  59 +
  60 +```dart
  61 +var name = 'Jonatas Borges'.obs;
  62 +```
  63 +
  64 +C'est *tout*. Si simple que ca.
  65 +
  66 +A partir de maintenant, nous pourrions désigner ces variables réactives - ". Obs" (ervables) comme _Rx_.
  67 +
  68 +Qu'est ce qui s'est passé derrière les rideaux? Nous avons créé un `Stream` de` String`s, assigné la valeur initiale `" Jonatas Borges "`, nous avons notifié tous les widgets qui utilisent `" Jonatas Borges "` qu'ils "appartiennent" maintenant à cette variable, et quand la valeur _Rx_ changements, ils devront également changer.
  69 +
  70 +C'est la **magie de GetX**, grâce aux performances de Dart.
  71 +
  72 +Mais, comme nous le savons, un `Widget` ne peut être changé que s'il est à l'intérieur d'une fonction, car les classes statiques n'ont pas le pouvoir de" changer automatiquement ".
  73 +
  74 +Vous devrez créer un `StreamBuilder`, vous abonner à cette variable pour écouter les changements et créer une" cascade "de` StreamBuilder` imbriqués si vous voulez changer plusieurs variables dans la même portée, non?
  75 +
  76 +Non, vous n'avez pas besoin d'un `StreamBuilder`, mais vous avez raison pour les classes statiques.
  77 +
  78 +Eh bien, dans la vue, nous avons généralement beaucoup de code standard lorsque nous voulons changer un widget spécifique, c'est la manière Flutter.
  79 +Avec **GetX**, vous pouvez également oublier ce code passe-partout.
  80 +
  81 +`StreamBuilder( … )`? `initialValue: …`? `builder: …`? Non, il vous suffit de placer cette variable dans un widget `Obx()`.
  82 +
  83 +```dart
  84 +Obx (() => Text (controller.name));
  85 +```
  86 +
  87 +_Que devez-vous mémoriser?_ Seulement `Obx(() =>`.
  88 +
  89 +Vous passez simplement ce Widget via une fonction dans un `Obx()` (l' "Observateur" du _Rx_).
  90 +
  91 +`Obx` est assez intelligent et ne changera que si la valeur de` controller.name` change.
  92 +
  93 +Si `name` est` "John" `, et que vous le changez en` "John" `(` name.value = "John" `), comme c'est la même` valeur` qu'avant, rien ne changera à l'écran, et `Obx`, pour économiser les ressources, ignorera simplement la nouvelle valeur et ne reconstruira pas le widget. **N'est-ce pas incroyable?**
  94 +
  95 +> Alors, que faire si j'ai 5 variables _Rx_ (observables) dans un `Obx`?
  96 +
  97 +Il sera simplement mis à jour lorsque **l'un d'entre eux** change.
  98 +
  99 +> Et si j'ai 30 variables dans une classe, lorsque j'en mets une à jour, est-ce que cela va mettre à jour **toutes** les variables qui sont dans cette classe?
  100 +
  101 +Non, juste le **Widget spécifique** qui utilise cette variable _Rx_.
  102 +
  103 +Ainsi, **GetX** ne met à jour l'écran que lorsque la variable _Rx_ change sa valeur.
  104 +
  105 +```
  106 +final isOpen = false.obs;
  107 +
  108 +// Rien de ne change... valeur identique.
  109 +void onButtonTap() => isOpen.value=false;
  110 +```
  111 +### Avantages
  112 +
  113 +**GetX()** vous aide lorsque vous avez besoin d'un contrôle **granulaire** sur ce qui est mis à jour.
  114 +
  115 +
  116 +Si vous n'avez pas besoin d'ID uniques, car toutes vos variables seront modifiées lorsque vous effectuez une action, utilisez `GetBuilder`,
  117 +parce que c'est un Simple State Updater (en blocs, comme `setState()`), fait en seulement quelques lignes de code.
  118 +Il a été rendu simple, pour avoir le moins d'impact sur le processeur, et juste pour remplir un seul objectif (une reconstruction de _l'état_) et dépenser le minimum de ressources possible.
  119 +
  120 +Si vous avez besoin d'un State Manager **puissant** , vous ne pouvez pas vous tromper avec **GetX**.
  121 +
  122 +Cela ne fonctionne pas avec les variables, mais __flows__, tout ce qu'il contient sont des `Streams` en réalité.
  123 +Vous pouvez utiliser _rxDart_ en conjonction avec lui, car tout est `Streams`.
  124 +Vous pouvez écouter les changements de chaque "variable _Rx_",
  125 +parce que tout ce qui se trouve dedans est un `Streams`.
  126 +
  127 +
  128 +C'est littéralement une approche _BLoC_, plus facile que _MobX_, et sans générateurs de code ni décorations.
  129 +Vous pouvez transformer **n'importe quoi** en un _"Observable"_ avec juste un `.obs`.
  130 +
  131 +### Performance maximale:
  132 +
  133 +En plus d'avoir un algorithme intelligent pour des reconstructions minimales, **GetX** utilise des comparateurs
  134 +pour s'assurer que l'État a changé.
  135 +
  136 +Si vous rencontrez des erreurs dans votre application et envoyez un changement d'état en double,
  137 +**GetX** garantira qu'il ne plantera pas.
  138 +
  139 +Avec **GetX**, l'état ne change que si la `valeur` change.
  140 +C'est la principale différence entre **GetX** et l'utilisation de _`computed` de MobX_.
  141 +Lors de la jonction de deux __observables__, si l'une change; le listener de cet _observable_ changera également.
  142 +
  143 +Avec **GetX**, si vous joignez deux variables, `GetX()` (similaire à `Observer()`), ne se reconstruira que si cela implique un réel changement d'état.
  144 +
  145 +### Declaration d une variable reactive
  146 +
  147 +Vous avez 3 façons de transformer une variable en "observable".
  148 +
  149 +1 - La première est d'utiliser **`Rx{Type}`**.
  150 +
  151 +```dart
  152 +// la valeur initiale est recommandée, mais pas obligatoire
  153 +final name = RxString('');
  154 +final isLogged = RxBool(false);
  155 +final count = RxInt(0);
  156 +final balance = RxDouble(0.0);
  157 +final items = RxList<String>([]);
  158 +final myMap = RxMap<String, int>({});
  159 +```
  160 +
  161 +2 - La seconde consiste à utiliser **`Rx`** et à utiliser les types `Rx<Type>` Génériques Darts
  162 +
  163 +```dart
  164 +final name = Rx<String>('');
  165 +final isLogged = Rx<Bool>(false);
  166 +final count = Rx<Int>(0);
  167 +final balance = Rx<Double>(0.0);
  168 +final number = Rx<Num>(0);
  169 +final items = Rx<List<String>>([]);
  170 +final myMap = Rx<Map<String, int>>({});
  171 +
  172 +// Classes personnalisées - il peut s'agir de n'importe quelle classe, littéralement
  173 +final user = Rx<User>();
  174 +```
  175 +
  176 +3 - La troisième approche, plus pratique, plus facile et préférée, ajoutez simplement **`.obs`** comme propriété de votre` valeur`:
  177 +
  178 +```dart
  179 +final name = ''.obs;
  180 +final isLogged = false.obs;
  181 +final count = 0.obs;
  182 +final balance = 0.0.obs;
  183 +final number = 0.obs;
  184 +final items = <String>[].obs;
  185 +final myMap = <String, int>{}.obs;
  186 +
  187 +// Classes personnalisées - il peut s'agir de n'importe quelle classe, littéralement
  188 +final user = User().obs;
  189 +```
  190 +
  191 +##### Avoir un etat reactif, c est facile.
  192 +
  193 +Comme nous le savons, _Dart_ se dirige maintenant vers _null safety_.
  194 +Pour être prêt, à partir de maintenant, vous devez toujours commencer vos variables _Rx_ avec une **valeur initiale**.
  195 +
  196 +> Transformer une variable en _observable_ + _valeurInitiale_ avec **GetX** est l'approche la plus simple et la plus pratique.
  197 +
  198 +Vous allez littéralement ajouter un "".obs"" à la fin de votre variable, et **c'est tout**, vous l'avez rendue observable,
  199 +et sa `.value`, eh bien, sera la _valeurInitiale_.
  200 +
  201 +### Utilisation des valeurs dans la Vue
  202 +
  203 +```dart
  204 +// dans le controlleur
  205 +final count1 = 0.obs;
  206 +final count2 = 0.obs;
  207 +int get sum => count1.value + count2.value;
  208 +```
  209 +
  210 +```dart
  211 +// dans la vue
  212 +GetX<Controller>(
  213 + builder: (controller) {
  214 + print("count 1 reconstruction");
  215 + return Text('${controller.count1.value}');
  216 + },
  217 +),
  218 +GetX<Controller>(
  219 + builder: (controller) {
  220 + print("count 2 reconstruction");
  221 + return Text('${controller.count2.value}');
  222 + },
  223 +),
  224 +GetX<Controller>(
  225 + builder: (controller) {
  226 + print("count 3 reconstruction");
  227 + return Text('${controller.sum}');
  228 + },
  229 +),
  230 +```
  231 +
  232 +Si nous incrémentons `count1.value++`, cela affichera:
  233 +- `count 1 reconstruction`
  234 +- `count 3 reconstruction`
  235 +
  236 +parce que `count1` a une valeur de `1`, et `1 + 0 = 1`, changeant la valeur du getter `sum`.
  237 +
  238 +Si nous incrémentons `count2.value++`, cela affichera:
  239 +- `count 2 reconstruction`
  240 +- `count 3 reconstruction`
  241 +
  242 +parce que `count2.value` a changé et que le résultat de `sum` est maintenant `2`.
  243 +
  244 +- NOTE: Par défaut, le tout premier événement reconstruira le widget, même s'il s'agit de la même `valeur`.
  245 + Ce comportement existe en raison de variables booléennes.
  246 +
  247 +Imaginez que vous fassiez ceci:
  248 +
  249 +```dart
  250 +var isLogged = false.obs;
  251 +```
  252 +
  253 +Et puis, vous vérifiez si un utilisateur est "connecté" pour déclencher un événement dans `ever`.
  254 +
  255 +```dart
  256 +@override
  257 +onInit(){
  258 + ever(isLogged, fireRoute);
  259 + isLogged.value = await Preferences.hasToken();
  260 +}
  261 +
  262 +fireRoute(logged) {
  263 + if (logged) {
  264 + Get.off(Home());
  265 + } else {
  266 + Get.off(Login());
  267 + }
  268 +}
  269 +```
  270 +
  271 +si `hasToken` était `false`, il n'y aurait pas de changement à `isLogged`, donc` ever() `ne serait jamais appelé.
  272 +Pour éviter ce type de comportement, la première modification d'un _observable_ déclenchera toujours un événement,
  273 +même s'il contient la même `.value`.
  274 +
  275 +Vous pouvez supprimer ce comportement si vous le souhaitez, en utilisant:
  276 +`isLogged.firstRebuild = false;`
  277 +
  278 +### Conditions pour reconstruire
  279 +
  280 +En outre, Get fournit un contrôle d'état raffiné. Vous pouvez conditionner un événement (comme l'ajout d'un objet à une liste), à ​​une certaine condition.
  281 +
  282 +```dart
  283 +// Premier paramètre: condition, doit retourner vrai ou faux.
  284 +// Deuxième paramètre: la nouvelle valeur à appliquer si la condition est vraie.
  285 +list.addIf(item < limit, item);
  286 +```
  287 +
  288 +Sans décorations, sans générateur de code, sans complications :smile:
  289 +
  290 +Connaissez-vous l'application 'counter' de Flutter? Votre classe Controller pourrait ressembler à ceci:
  291 +
  292 +```dart
  293 +class CountController extends GetxController {
  294 + final count = 0.obs;
  295 +}
  296 +```
  297 +
  298 +Avec un simple:
  299 +
  300 +```dart
  301 +controller.count.value++
  302 +```
  303 +
  304 +Vous pouvez mettre à jour la variable de compteur dans votre interface utilisateur, quel que soit l'endroit où elle est stockée.
  305 +
  306 +### Quand utiliser .obs
  307 +
  308 +Vous pouvez tout transformer sur obs. Voici deux façons de procéder:
  309 +
  310 +* Vous pouvez convertir vos valeurs de classe en obs
  311 +```dart
  312 +class RxUser {
  313 + final name = "Camila".obs;
  314 + final age = 18.obs;
  315 +}
  316 +```
  317 +
  318 +* ou vous pouvez convertir la classe entière en un observable:
  319 +```dart
  320 +class User {
  321 + User({String name, int age});
  322 + var name;
  323 + var age;
  324 +}
  325 +
  326 +// en instanciant:
  327 +final user = User(name: "Camila", age: 18).obs;
  328 +```
  329 +
  330 +### Remarque sur List
  331 +
  332 +Les listes sont complètement observables, tout comme les objets qu'elles contiennent. De cette façon, si vous ajoutez une valeur à une liste, cela reconstruira automatiquement les widgets qui l'utilisent.
  333 +
  334 +Vous n'avez pas non plus besoin d'utiliser ".value" avec des listes, l'incroyable api de Dart nous a permis de supprimer cela.
  335 +Malheureusement, les types primitifs comme String et int ne peuvent pas être étendus, ce qui rend l'utilisation de .value obligatoire, mais ce ne sera pas un problème si vous travaillez avec des getters et des setters pour ceux-ci.
  336 +
  337 +```dart
  338 +// Dans le controlleur
  339 +final String title = 'User Info:'.obs;
  340 +final list = List<User>().obs;
  341 +
  342 +// Dans la vue
  343 +Text(controller.title.value), // La String doit avoir .value devant elle
  344 +ListView.builder (
  345 + itemCount: controller.list.length // pas besoin pour List
  346 +)
  347 +```
  348 +
  349 +Lorsque vous rendez vos propres classes observables, il existe une manière différente de les mettre à jour:
  350 +
  351 +```dart
  352 +// sur le fichier modèle
  353 +// nous allons rendre la classe entière observable au lieu de chaque attribut
  354 +class User() {
  355 + User({this.name = '', this.age = 0});
  356 + String name;
  357 + int age;
  358 +}
  359 +
  360 +
  361 +// Dans le controlleur
  362 +final user = User().obs;
  363 +// lorsque vous devez mettre à jour la variable utilisateur:
  364 +user.update( (user) { // ce paramètre est la classe même que vous souhaitez mettre à jour
  365 +user.name = 'Jonny';
  366 +user.age = 18;
  367 +});
  368 +// une autre manière de mettre à jour la variable user:
  369 +user(User(name: 'João', age: 35));
  370 +
  371 +// Dans la vue:
  372 +Obx(()=> Text("Name ${user.value.name}: Age: ${user.value.age}"))
  373 +// vous pouvez également accéder aux valeurs du modèle sans le .value:
  374 +user().name; //notez que c'est la variable utilisateur, pas la classe (la variable a un u minuscule)
  375 +```
  376 +
  377 +Vous n'êtes pas obligé de travailler avec des setters si vous ne le souhaitez pas. vous pouvez utiliser les API `assign` et `assignAll`.
  378 +L'API `assign` effacera votre liste et ajoutera un seul objet que vous souhaitez.
  379 +L'API `assignAll` effacera la liste existante et ajoutera tous les objets itérables que vous y injecterez.
  380 +
  381 +### Pourquoi je dois utiliser .value
  382 +
  383 +Nous pourrions supprimer l'obligation d'utiliser 'value' pour `String` et` int` avec une simple décoration et un générateur de code, mais le but de cette bibliothèque est précisément d'éviter les dépendances externes. Nous souhaitons proposer un environnement prêt à la programmation, impliquant l'essentiel (gestion des routes, des dépendances et des états), de manière simple, légère et performante, sans avoir besoin d'un package externe.
  384 +
  385 +Vous pouvez littéralement ajouter 3 lettres à votre pubspec (get) et un signe deux-points et commencer la programmation. Toutes les solutions incluses par défaut, de la gestion des routes à la gestion des états, visent la facilité, la productivité et la performance.
  386 +
  387 +Le poids total de cette bibliothèque est inférieur à celui d'un seul gestionnaire d'état, bien qu'il s'agisse d'une solution complète, et c'est ce que vous devez comprendre.
  388 +
  389 +Si vous êtes dérangé par `.value`, et comme un générateur de code, MobX est une excellente alternative, et vous pouvez l'utiliser en conjonction avec Get. Pour ceux qui veulent ajouter une seule dépendance dans pubspec et commencer à programmer sans se soucier de l'incompatibilité de la version d'un package avec un autre, ou si l'erreur d'une mise à jour d'état vient du gestionnaire d'état ou de la dépendance, ou encore, ne veulent pas s'inquiéter de la disponibilité des contrôleurs, que ce soit littéralement "juste de la programmation", get est tout simplement parfait.
  390 +
  391 +Si vous n'avez aucun problème avec le générateur de code MobX, ou si vous n'avez aucun problème avec le code standard BLoC, vous pouvez simplement utiliser Get pour les routes et oublier qu'il a un gestionnaire d'état. Get SEM et RSM sont nés par nécessité, mon entreprise avait un projet avec plus de 90 contrôleurs, et le générateur de code a simplement pris plus de 30 minutes pour terminer ses tâches après un Flutter Clean sur une machine raisonnablement bonne, si votre projet il a 5, 10, 15 contrôleurs, n'importe quel gestionnaire d'état vous suffira bien. Si vous avez un projet d'une taille absurde et que le générateur de code est un problème pour vous, cette solution vous a été attribuée.
  392 +
  393 +Évidemment, si quelqu'un veut contribuer au projet et créer un générateur de code, ou quelque chose de similaire, je vais créer un lien dans ce readme comme alternative, mon besoin n'est pas le besoin de tous les développeurs, mais pour l'instant je dis q'il y a de bonnes solutions qui font déjà cela, comme MobX.
  394 +
  395 +### Obx()
  396 +
  397 +Les types dans Get à l'aide de Bindings ne sont pas nécessaires. Vous pouvez utiliser le widget Obx, au lieu de GetX, qui ne reçoit que la fonction anonyme qui crée un widget.
  398 +Évidemment, si vous n'utilisez pas de type, vous devrez avoir une instance de votre contrôleur pour utiliser les variables, ou utiliser `Get.find<Controller>()` .value ou Controller.to.value pour récupérer la valeur .
  399 +
  400 +### Workers
  401 +
  402 +Les 'workers' vous assisteront, déclenchant des callbacks spécifiques lorsqu'un événement se produit.
  403 +
  404 +```dart
  405 +/// Appelée à chaque fois que `count1` change.
  406 +ever(count1, (_) => print("$_ a été modifié"));
  407 +
  408 +/// Appelée uniquement la première fois que la variable est modifiée
  409 +once(count1, (_) => print("$_ a été changé une fois"));
  410 +
  411 +/// Anti DDos - Appelée chaque fois que l'utilisateur arrête de taper pendant 1 seconde, par exemple.
  412 +debounce(count1, (_) => print("debouce$_"), time: Duration(seconds: 1));
  413 +
  414 +/// Ignore toutes les modifications pendant 1 seconde.
  415 +interval(count1, (_) => print("interval $_"), time: Duration(seconds: 1));
  416 +```
  417 +Tous les workers (sauf `debounce`) ont un paramètre nommé `condition`, qui peut etre un `bool` ou un callback qui retourne un `bool`.
  418 +Cette `condition` definit quand la fonction `callback` est executée.
  419 +
  420 +Tous les workers renvoyent un objet `Worker`, qui peut être utilisé pour annuler ( via `dispose()` ) le `worker`.
  421 +
  422 +- **`ever`**
  423 + est appelée chaque fois que la variable _Rx_ émet une nouvelle valeur.
  424 +
  425 +- **`everAll`**
  426 + Un peu comme `ever`, mais il prend une` List` de valeurs _Rx_. Appelée chaque fois que sa variable est changée. C'est tout.
  427 +
  428 +- **`once`**
  429 +'once' est appelée uniquement la première fois que la variable a été modifiée.
  430 +
  431 +- **`debounce`**
  432 +'debounce' est très utile dans les fonctions de recherche, où vous souhaitez que l'API ne soit appelée que lorsque l'utilisateur a fini de taper. Si l'utilisateur tape "Jonny", vous aurez 5 recherches dans les API, par la lettre J, o, n, n et y. Avec Get, cela ne se produit pas, car vous aurez un Worker "anti-rebond" qui ne sera déclenché qu'à la fin de la saisie.
  433 +
  434 +- **`interval`**
  435 +'interval' est différent de 'debounce'. Avec `debounce` si l'utilisateur fait 1000 changements à une variable en 1 seconde, il n'enverra que le dernier après le temporisateur stipulé (la valeur par défaut est 800 millisecondes). 'Interval' ignorera à la place toutes les actions de l'utilisateur pour la période stipulée. Si vous envoyez des événements pendant 1 minute, 1000 par seconde, debounce ne vous enverra que le dernier, lorsque l'utilisateur arrête de mitrailler les événements. interval délivrera des événements toutes les secondes, et s'il est réglé sur 3 secondes, il fournira 20 événements cette minute. Ceci est recommandé pour éviter les abus, dans des fonctions où l'utilisateur peut rapidement cliquer sur quelque chose et obtenir un avantage (imaginez que l'utilisateur puisse gagner des pièces en cliquant sur quelque chose, s'il cliquait 300 fois dans la même minute, il aurait 300 pièces, en utilisant l'intervalle, vous pouvez définir une période de 3 secondes, et même en cliquant 300 ou mille fois, le maximum qu'il obtiendrait en 1 minute serait de 20 pièces, en cliquant 300 ou 1 million de fois). Le 'debounce' convient aux anti-DDos, pour des fonctions comme la recherche où chaque changement de onChange entraînerait une requête à votre api. Debounce attendra que l'utilisateur arrête de taper le nom, pour faire la demande. S'il était utilisé dans le scénario de pièces mentionné ci-dessus, l'utilisateur ne gagnerait qu'une pièce, car il n'est exécuté que lorsque l'utilisateur "fait une pause" pendant le temps établi.
  436 +
  437 +- NOTE: Les 'workers' doivent toujours être utilisés lors du démarrage d'un contrôleur ou d'une classe, il doit donc toujours être dans onInit (recommandé), le constructeur de classe ou l'initState d'un StatefulWidget (cette pratique n'est pas recommandée dans la plupart des cas, mais cela ne devrait poser aucun problème).
  438 +
  439 +## Gestionnaire d etat simple
  440 +
  441 +Get a un gestionnaire d'état extrêmement léger et facile, qui n'utilise pas ChangeNotifier, répondra aux besoins en particulier des nouveaux utilisateurs de Flutter et ne posera pas de problèmes pour les applications volumineuses.
  442 +
  443 +GetBuilder vise précisément le contrôle de plusieurs états. Imaginez que vous avez ajouté 30 produits à un panier, que vous cliquez sur supprimer un, en même temps que la liste est mise à jour, le prix est mis à jour et le badge dans le panier est mis à jour avec un nombre plus petit. Ce type d'approche fait de GetBuilder un tueur, car il regroupe les états et les modifie tous à la fois sans aucune "logique de calcul" pour cela. GetBuilder a été créé avec ce type de situation à l'esprit, car pour un changement d'état éphémère, vous pouvez utiliser setState et vous n'aurez pas besoin d'un gestionnaire d'état pour cela.
  444 +
  445 +De cette façon, si vous voulez un contrôleur individuel, vous pouvez lui attribuer des ID ou utiliser GetX. Cela dépend de vous, en vous rappelant que plus vous avez de widgets "individuels", plus les performances de GetX se démarqueront, tandis que les performances de GetBuilder devraient être supérieures, en cas de changement d'état multiple.
  446 +
  447 +### Atouts
  448 +
  449 +1. Met à jour uniquement les widgets requis.
  450 +
  451 +2. N'utilise pas changeNotifier, c'est le gestionnaire d'état qui utilise le moins de mémoire (proche de 0 Mo).
  452 +
  453 +3. Oubliez StatefulWidget! Avec Get, vous n'en aurez jamais besoin. Avec les autres gestionnaires d'états, vous devrez probablement utiliser un StatefulWidget pour obtenir l'instance de votre fournisseur, BLoC, MobX Controller, etc. Mais vous êtes-vous déjà arrêté pour penser que votre appBar, votre 'scaffold', et la plupart des les widgets de votre classe sont sans état (stateless)? Alors pourquoi sauvegarder l'état d'une classe entière, si vous pouvez sauvegarder l'état du widget qui est `avec état` (statefull)? Get résout cela aussi. Créez une classe sans état, rendez tout `sans état`. Si vous devez mettre à jour un seul composant, enveloppez-le avec GetBuilder et son état sera conservé.
  454 +
  455 +4. Organisez votre projet pour de vrai! Les contrôleurs ne doivent pas être dans votre interface utilisateur, placer votre TextEditController ou tout contrôleur que vous utilisez dans votre classe Controller.
  456 +
  457 +5. Avez-vous besoin de déclencher un événement pour mettre à jour un widget dès son rendu? GetBuilder a la propriété "initState", tout comme StatefulWidget, et vous pouvez appeler des événements depuis votre contrôleur, directement depuis celui-ci, aucun événement n'étant placé dans votre initState.
  458 +
  459 +6. Avez-vous besoin de déclencher une action comme la fermeture de stream, de timers, etc.? GetBuilder a également la propriété dispose(), où vous pouvez appeler des événements dès que ce widget est détruit.
  460 +
  461 +7. N'utilisez les streams que si nécessaire. Vous pouvez utiliser vos StreamControllers à l'intérieur de votre contrôleur normalement, et utiliser StreamBuilder également normalement, mais rappelez-vous qu'un stream consomme raisonnablement de la mémoire, la programmation réactive est belle, mais vous ne devriez pas en abuser. 30 streams ouverts simultanément peuvent être pires que changeNotifier (et changeNotifier est très mauvais).
  462 +
  463 +8. Mettez à jour les widgets sans dépenser de RAM pour cela. Get stocke uniquement l'ID de créateur GetBuilder et met à jour ce GetBuilder si nécessaire. La consommation de mémoire du stockage get ID en mémoire est très faible, même pour des milliers de GetBuilders. Lorsque vous créez un nouveau GetBuilder, vous partagez en fait l'état de GetBuilder qui a un ID de créateur. Un nouvel état n'est pas créé pour chaque GetBuilder, ce qui économise BEAUCOUP de RAM pour les applications volumineuses. Fondamentalement, votre application sera entièrement sans état (stateless), et les quelques widgets qui seront stateful (dans GetBuilder) auront un seul état, et par conséquent, la mise à jour d'un seul les mettra tous à jour. L'état est unique.
  464 +
  465 +9. Get est omniscient et, dans la plupart des cas, il sait exactement quand sortir de mémoire un contrôleur. Vous ne devez pas vous soucier du moment de vous débarrasser d'un contrôleur, Get connaît le meilleur moment pour le faire.
  466 +
  467 +### Utilisation
  468 +
  469 +```dart
  470 +// Créez la classe controller qui 'extends' GetxController
  471 +class Controller extends GetxController {
  472 + int counter = 0;
  473 + void increment() {
  474 + counter++;
  475 + update(); // utilisez update() pour mettre à jour la variable de compteur sur l'interface utilisateur lorsque incrément() est appelé
  476 + }
  477 +}
  478 +// Sur votre classe Stateless / Stateful, utilisez GetBuilder pour mettre à jour le texte lorsque incrément() est appelé
  479 +GetBuilder<Controller>(
  480 + init: Controller(), // INITIER CA UNIQUEMENT LA PREMIÈRE FOIS
  481 + builder: (_) => Text(
  482 + '${_.counter}',
  483 + ),
  484 +)
  485 +//Initialisez votre contrôleur uniquement la première fois. La deuxième fois que vous utilisez ReBuilder pour le même contrôleur, ne recommencez pas. Votre contrôleur sera automatiquement supprimé de la mémoire dès que le widget qui l'a marqué comme `init` sera déployé. Vous n'avez pas à vous en soucier, Get le fera automatiquement, assurez-vous simplement de ne pas démarrer deux fois le même contrôleur.
  486 +```
  487 +
  488 +**Fait!**
  489 +
  490 +- Vous avez déjà appris à gérer les états avec Get.
  491 +
  492 +- Note: Vous pouvez souhaiter une organisation plus grande et ne pas utiliser la propriété init. Pour cela, vous pouvez créer une classe et étendre la classe Bindings, et y mentionner les contrôleurs qui seront créés dans cette route. Les contrôleurs ne seront pas créés à ce moment-là, au contraire, il ne s'agit que d'une déclaration, de sorte que la première fois que vous utilisez un contrôleur, Get saura où chercher. Get restera lazyLoad et continuera à supprimer les contrôleurs lorsqu'ils ne seront plus nécessaires. Voir l'exemple pub.dev pour voir comment cela fonctionne.
  493 +
  494 +Si vous parcourez de nombreuses routes et avez besoin de données qui se trouvaient dans votre contrôleur précédemment utilisé, il vous suffit de réutiliser GetBuilder (sans init):
  495 +
  496 +```dart
  497 +class OtherClass extends StatelessWidget {
  498 + @override
  499 + Widget build(BuildContext context) {
  500 + return Scaffold(
  501 + body: Center(
  502 + child: GetBuilder<Controller>(
  503 + builder: (s) => Text('${s.counter}'),
  504 + ),
  505 + ),
  506 + );
  507 + }
  508 +
  509 +```
  510 +
  511 +Si vous devez utiliser votre contrôleur dans de nombreux autres endroits, et en dehors de GetBuilder, créez simplement un get dans votre contrôleur et ayez-le facilement. (ou utilisez `Get.find<Controller>()`)
  512 +
  513 +```dart
  514 +class Controller extends GetxController {
  515 +
  516 + /// Vous n'en avez pas besoin. Je recommande de l'utiliser uniquement pour faciliter la syntaxe.
  517 + /// avec la méthode statique: Controller.to.counter();
  518 + /// sans méthode statique: Get.find<Controller>() .counter();
  519 + /// Il n'y a aucune différence de performances, ni aucun effet secondaire de l'utilisation de l'une ou l'autre syntaxe. Un seul n'a pas besoin du type, et l'autre l'EDI le complétera automatiquement.
  520 + static Controller get to => Get.find(); // Ajouter cette ligne
  521 +
  522 + int counter = 0;
  523 + void increment() {
  524 + counter++;
  525 + update();
  526 + }
  527 +}
  528 +```
  529 +
  530 +Et puis vous pouvez accéder directement à votre contrôleur, de cette façon:
  531 +
  532 +```dart
  533 +FloatingActionButton(
  534 + onPressed:() {
  535 + Controller.to.increment(),
  536 + } // This is incredibly simple!
  537 + child: Text("${Controller.to.counter}"),
  538 +),
  539 +```
  540 +
  541 +Lorsque vous appuyez sur FloatingActionButton, tous les widgets qui écoutent la variable `counter` seront mis à jour automatiquement.
  542 +
  543 +### Comment il gère les contrôleurs
  544 +
  545 +Disons que nous avons ceci:
  546 +
  547 +`Class a => Class B (has controller X) => Class C (has controller X)`
  548 +
  549 +Dans la classe A, le contrôleur n'est pas encore en mémoire, car vous ne l'avez pas encore utilisé (Get est lazyLoad). Dans la classe B, vous avez utilisé le contrôleur et il est entré en mémoire. Dans la classe C, vous avez utilisé le même contrôleur que dans la classe B, Get partagera l'état du contrôleur B avec le contrôleur C, et le même contrôleur est toujours en mémoire. Si vous fermez l'écran C et l'écran B, Get retirera automatiquement le contrôleur X de la mémoire et libèrera des ressources, car la classe A n'utilise pas le contrôleur. Si vous naviguez à nouveau vers B, le contrôleur X entrera à nouveau en mémoire, si au lieu de passer à la classe C, vous revenez en classe A, Get retirera le contrôleur de la mémoire de la même manière. Si la classe C n'utilisait pas le contrôleur et que vous retiriez la classe B de la mémoire, aucune classe n'utiliserait le contrôleur X et de même, elle serait éliminée. La seule exception qui peut gâcher Get, est si vous supprimez B de l'itinéraire de manière inattendue et essayez d'utiliser le contrôleur dans C.Dans ce cas, l'ID de créateur du contrôleur qui était dans B a été supprimé et Get a été programmé pour supprimer de la mémoire tous les contrôleurs qui n'ont pas d'ID de créateur. Si vous avez l'intention de faire cela, ajoutez l'indicateur "autoRemove: false" au GetBuilder de la classe B et utilisez adoptID = true; dans GetBuilder de la classe C.
  550 +
  551 +### Vous n'aurez plus besoin de StatefulWidgets
  552 +
  553 +Utiliser StatefulWidgets signifie stocker inutilement l'état d'écrans entiers, même parce que si vous avez besoin de reconstruire au minimum un widget, vous l'intègrerez dans un Consumer / Observer / BlocProvider / GetBuilder / GetX / Obx, qui sera un autre StatefulWidget.
  554 +La classe StatefulWidget est une classe plus grande que StatelessWidget, qui allouera plus de RAM, et cela ne fera peut-être pas une différence significative entre une ou deux classes, mais cela le fera très certainement lorsque vous en aurez 100!
  555 +À moins que vous n'ayez besoin d'utiliser un mixin, comme TickerProviderStateMixin, il sera totalement inutile d'utiliser un StatefulWidget avec Get.
  556 +
  557 +Vous pouvez appeler toutes les méthodes d'un StatefulWidget directement à partir d'un GetBuilder.
  558 +Si vous devez appeler la méthode initState() ou dispose() par exemple, vous pouvez les appeler directement:
  559 +
  560 +```dart
  561 +GetBuilder<Controller>(
  562 + initState: (_) => Controller.to.fetchApi(),
  563 + dispose: (_) => Controller.to.closeStreams(),
  564 + builder: (s) => Text('${s.username}'),
  565 +),
  566 +```
  567 +
  568 +Une bien meilleure approche que celle-ci consiste à utiliser les méthodes onInit() et onClose() directement à partir de votre contrôleur.
  569 +
  570 +```dart
  571 +@override
  572 +void onInit() {
  573 + fetchApi();
  574 + super.onInit();
  575 +}
  576 +```
  577 +
  578 +- NOTE: Si vous voulez démarrer une méthode au moment où le contrôleur est appelé pour la première fois, vous N'AVEZ PAS BESOIN d'utiliser des constructeurs pour cela, en fait, en utilisant un package orienté performance comme Get, cela frôle la mauvaise pratique, car il s'écarte de la logique dans laquelle les contrôleurs sont créés ou alloués (si vous créez une instance de ce contrôleur, le constructeur sera appelé immédiatement, vous remplirez un contrôleur avant même qu'il ne soit utilisé, vous allouez de la mémoire sans qu'elle ne soit utilisée , cela nuit définitivement aux principes de cette bibliothèque). Les méthodes onInit(); et onClose(); ont été créés pour cela, ils seront appelés lors de la création du Controller, ou lors de sa première utilisation, selon que vous utilisez Get.lazyPut ou non. Si vous voulez, par exemple, faire un appel à votre API pour remplir des données, vous pouvez oublier la méthode à l'ancienne de initState / dispose, lancez simplement votre appel à l'API dans onInit, et si vous devez exécuter une commande comme la fermeture des flux, utilisez onClose() pour cela.
  579 +
  580 +### Pourquoi ca existe
  581 +
  582 +Le but de ce package est précisément de vous donner une solution complète pour la navigation des routes, la gestion des dépendances et des états, en utilisant le moins de dépendances possible, avec un haut degré de découplage. Get engage toutes les API Flutter de haut et bas niveau en lui-même, pour vous assurer de travailler avec le moins de couplage possible. Nous centralisons tout dans un seul package, pour vous assurer que vous n'avez aucun type de couplage dans votre projet. De cette façon, vous pouvez mettre uniquement des widgets dans votre vue et laisser la partie de votre équipe qui travaille avec la `business logique` libre, pour travailler avec la business logique sans dépendre d'aucun élément de la vue. Cela fournit un environnement de travail beaucoup plus propre, de sorte qu'une partie de votre équipe ne travaille qu'avec des widgets, sans se soucier d'envoyer des données à votre contrôleur, et une partie de votre équipe ne travaille qu'avec la business logique dans toute son ampleur, sans dépendre d'aucun élément de la Vue.
  583 +
  584 +Donc, pour simplifier cela:
  585 +Vous n'avez pas besoin d'appeler des méthodes dans initState et de les envoyer par paramètre à votre contrôleur, ni d'utiliser votre constructeur de contrôleur pour cela, vous avez la méthode onInit() qui est appelée au bon moment pour démarrer vos services.
  586 +Vous n'avez pas besoin d'appeler l'appareil, vous avez la méthode onClose() qui sera appelée au moment exact où votre contrôleur n'est plus nécessaire et sera supprimé de la mémoire. De cette façon, ne laissez les vues que pour les widgets, abstenez-vous d'y mettre tout type de business logique.
  587 +
  588 +N'appelez pas une méthode dispose() dans GetxController, cela ne fera rien, rappelez-vous que le contrôleur n'est pas un Widget, vous ne devez pas le `supprimer`, et il sera automatiquement et intelligemment supprimé de la mémoire par Get. Si vous avez utilisé un Stream et que vous souhaitez le fermer, insérez-le simplement dans la méthode close(). Exemple:
  589 +
  590 +```dart
  591 +class Controller extends GetxController {
  592 + StreamController<User> user = StreamController<User>();
  593 + StreamController<String> name = StreamController<String>();
  594 +
  595 + /// pour fermer stream = méthode onClose(), pas dispose().
  596 + @override
  597 + void onClose() {
  598 + user.close();
  599 + name.close();
  600 + super.onClose();
  601 + }
  602 +}
  603 +```
  604 +
  605 +Cycle de vie du controlleur:
  606 +
  607 +- onInit() quand il est créé.
  608 +- onClose() quand il est fermé pour apporter des modifications en préparation de la méthode delete.
  609 +- deleted: vous n'avez pas accès à cette API car elle supprime littéralement le contrôleur de la mémoire. Il est littéralement supprimé, sans laisser de trace.
  610 +
  611 +### Autres formes d utilisation
  612 +
  613 +Vous pouvez utiliser l'instance Controller directement sur la valeur GetBuilder:
  614 +
  615 +```dart
  616 +GetBuilder<Controller>(
  617 + init: Controller(),
  618 + builder: (value) => Text(
  619 + '${value.counter}', // ici
  620 + ),
  621 +),
  622 +```
  623 +
  624 +Vous pouvez également avoir besoin d'une instance de votre contrôleur en dehors de votre GetBuilder, et vous pouvez utiliser ces approches pour y parvenir:
  625 +
  626 +```dart
  627 +class Controller extends GetxController {
  628 + static Controller get to => Get.find();
  629 +[...]
  630 +}
  631 +// Dans la vue:
  632 +GetBuilder<Controller>(
  633 + init: Controller(), // utilisez-le seulement la première fois sur chaque contrôleur
  634 + builder: (_) => Text(
  635 + '${Controller.to.counter}', // ici
  636 + )
  637 +),
  638 +```
  639 +
  640 +ou encore
  641 +
  642 +```dart
  643 +class Controller extends GetxController {
  644 + // static Controller get to => Get.find(); // sans static get
  645 +[...]
  646 +}
  647 +// Dans la classe stateful/stateless
  648 +GetBuilder<Controller>(
  649 + init: Controller(), // utilisez-le seulement la première fois sur chaque contrôleur
  650 + builder: (_) => Text(
  651 + '${Get.find<Controller>().counter}', // ici
  652 + ),
  653 +),
  654 +```
  655 +
  656 +- Vous pouvez utiliser des approches `non canoniques` pour ce faire. Si vous utilisez un autre gestionnaire de dépendances, comme get_it, modular, etc., et que vous souhaitez simplement fournir l'instance de contrôleur, vous pouvez le faire:
  657 +
  658 +```dart
  659 +Controller controller = Controller();
  660 +[...]
  661 +GetBuilder<Controller>(
  662 + init: controller, // ici
  663 + builder: (_) => Text(
  664 + '${controller.counter}', // ici
  665 + ),
  666 +),
  667 +
  668 +```
  669 +
  670 +### IDs Uniques
  671 +
  672 +Si vous souhaitez affiner le contrôle de mise à jour d'un widget avec GetBuilder, vous pouvez leur attribuer des ID uniques:
  673 +
  674 +```dart
  675 +GetBuilder<Controller>(
  676 + id: 'text'
  677 + init: Controller(), // utilisez-le seulement la première fois sur chaque contrôleur
  678 + builder: (_) => Text(
  679 + '${Get.find<Controller>().counter}', // ici
  680 + ),
  681 +),
  682 +```
  683 +
  684 +Et mettez-le à jour de cette façon:
  685 +
  686 +```dart
  687 +update(['text']);
  688 +```
  689 +
  690 +Vous pouvez également imposer des conditions pour la mise à jour:
  691 +
  692 +```dart
  693 +update(['text'], counter < 10);
  694 +```
  695 +
  696 +GetX le fait automatiquement et ne reconstruit que le widget qui utilise la variable exacte qui a été modifiée, si vous remplacez une variable par la même que la précédente et que cela n'implique pas un changement d'état, GetX ne reconstruira pas le widget pour économiser de la mémoire et Cycles CPU (3 est affiché à l'écran, et vous changez à nouveau la variable à 3. Dans la plupart des gestionnaires d'états, cela entraînera une nouvelle reconstruction, mais avec GetX, le widget ne sera reconstruit qu'à nouveau, si en fait son état a changé ).
  697 +
  698 +## Mélanger les deux gestionnaires d'état
  699 +
  700 +Certaines personnes ont ouvert une demande de fonctionnalité, car elles ne voulaient utiliser qu'un seul type de variable réactive, et les autres mécanismes, et devaient insérer un Obx dans un GetBuilder pour cela. En y réfléchissant, MixinBuilder a été créé. Il permet à la fois des changements réactifs en changeant les variables ".obs" et des mises à jour mécaniques via update(). Cependant, des 4 widgets c'est celui qui consomme le plus de ressources, car en plus d'avoir un Abonnement pour recevoir les événements de changement de ses enfants, il souscrit à la méthode de mise à jour de son contrôleur.
  701 +
  702 +L'extension de GetxController est importante, car ils ont des cycles de vie et peuvent `démarrer` et `terminer` des événements dans leurs méthodes onInit() et onClose(). Vous pouvez utiliser n'importe quelle classe pour cela, mais je vous recommande fortement d'utiliser la classe GetxController pour placer vos variables, qu'elles soient observables ou non.
  703 +
  704 +## GetBuilder vs GetX vs Obx vs MixinBuilder
  705 +
  706 +En une décennie de travail avec la programmation, j'ai pu apprendre de précieuses leçons.
  707 +
  708 +Mon premier contact avec la programmation réactive a été tellement "wow, c'est incroyable" et en fait la programmation réactive est incroyable.
  709 +Cependant, elle ne convient pas à toutes les situations. Souvent, il suffit de changer l'état de 2 ou 3 widgets en même temps, ou d'un changement d'état éphémère, auquel cas la programmation réactive n'est pas mauvaise, mais elle n'est pas appropriée.
  710 +
  711 +La programmation réactive a une consommation de RAM plus élevée qui peut être compensée par le flux de travail individuel, ce qui garantira qu'un seul widget est reconstruit et si nécessaire, mais créer une liste avec 80 objets, chacun avec plusieurs flux n'est pas une bonne idée . Ouvrez le 'dart inspect' et vérifiez combien un StreamBuilder consomme, et vous comprendrez ce que j'essaie de vous dire.
  712 +
  713 +Dans cet esprit, j'ai créé le gestionnaire d'état simple. C'est simple, et c'est exactement ce que vous devriez lui demander: mettre à jour l'état par blocs de manière simple et de la manière la plus économique.
  714 +
  715 +GetBuilder est très économique en RAM, et il n'y a guère d'approche plus économique que lui (du moins je ne peux pas en imaginer une, si elle existe, merci de nous le faire savoir).
  716 +
  717 +Cependant, GetBuilder est toujours un gestionnaire d'état mécanique, vous devez appeler update() comme vous auriez besoin d'appeler les notifyListeners() de Provider.
  718 +
  719 +Il y a d'autres situations où la programmation réactive est vraiment intéressante, et ne pas travailler avec elle revient à réinventer la roue. Dans cet esprit, GetX a été créé pour fournir tout ce qui est le plus moderne et le plus avancé dans un gestionnaire d'état. Il met à jour uniquement ce qui est nécessaire et si nécessaire, si vous avez une erreur et envoyez 300 changements d'état simultanément, GetX filtrera et mettra à jour l'écran uniquement si l'état change réellement.
  720 +
  721 +GetX est toujours plus économique que tout autre gestionnaire d'état réactif, mais il consomme un peu plus de RAM que GetBuilder. En y réfléchissant et en visant à maximiser la consommation de ressources, Obx a été créé. Contrairement à GetX et GetBuilder, vous ne pourrez pas initialiser un contrôleur à l'intérieur d'un Obx, c'est juste un widget avec un StreamSubscription qui reçoit les événements de changement de vos widgets enfants, c'est tout. Il est plus économique que GetX, mais perd face à GetBuilder, ce qui était prévisible, car il est réactif, et GetBuilder a l'approche la plus simpliste qui existe, de stocker le hashcode d'un widget et son StateSetter. Avec Obx, vous n'avez pas besoin d'écrire votre type de contrôleur, et vous pouvez entendre le changement de plusieurs contrôleurs différents, mais il doit être initialisé avant, soit en utilisant l'approche d'exemple au début de ce readme, soit en utilisant la classe Bindings.
@@ -84,9 +84,9 @@ Anda bisa melakukan lazyload terhadap sebuah dependensi supaya dependensi terseb @@ -84,9 +84,9 @@ Anda bisa melakukan lazyload terhadap sebuah dependensi supaya dependensi terseb
84 Get.lazyPut<ApiMock>(() => ApiMock()); 84 Get.lazyPut<ApiMock>(() => ApiMock());
85 85
86 Get.lazyPut<FirebaseAuth>( 86 Get.lazyPut<FirebaseAuth>(
87 - () => {  
88 - // ... beberapa logic jika diperlukan..  
89 - return FirebaseAuth() 87 + () {
  88 + // ... beberapa logic jika diperlukan..
  89 + return FirebaseAuth();
90 }, 90 },
91 tag: Math.random().toString(), 91 tag: Math.random().toString(),
92 fenix: true 92 fenix: true
@@ -322,7 +322,7 @@ getPages: [ @@ -322,7 +322,7 @@ getPages: [
322 GetPage( 322 GetPage(
323 name: '/', 323 name: '/',
324 page: () => HomeView(), 324 page: () => HomeView(),
325 - binding: BindingsBuilder(() => { 325 + binding: BindingsBuilder(() {
326 Get.lazyPut<ControllerX>(() => ControllerX()); 326 Get.lazyPut<ControllerX>(() => ControllerX());
327 Get.put<Service>(()=> Api()); 327 Get.put<Service>(()=> Api());
328 }), 328 }),
@@ -330,7 +330,7 @@ getPages: [ @@ -330,7 +330,7 @@ getPages: [
330 GetPage( 330 GetPage(
331 name: '/details', 331 name: '/details',
332 page: () => DetailsView(), 332 page: () => DetailsView(),
333 - binding: BindingsBuilder(() => { 333 + binding: BindingsBuilder(() {
334 Get.lazyPut<DetailsController>(() => DetailsController()); 334 Get.lazyPut<DetailsController>(() => DetailsController());
335 }), 335 }),
336 ), 336 ),
@@ -248,6 +248,21 @@ print(Get.parameters['user']); @@ -248,6 +248,21 @@ print(Get.parameters['user']);
248 // keluaran: 34954 248 // keluaran: 34954
249 ``` 249 ```
250 250
  251 +atau kirim beberapa parameter seperti ini
  252 +
  253 +```dart
  254 +Get.toNamed("/profile/34954?flag=true");
  255 +```
  256 +
  257 +Pada layar kedua, ambil data berdasarkan parameter seperti biasanya
  258 +
  259 +```dart
  260 +print(Get.parameters['user']);
  261 +print(Get.parameters['flag']);
  262 +// keluaran: 34954 true
  263 +```
  264 +
  265 +
251 Dan sekarang, yang anda perlu lakukan adalah menggunakan Get.toNamed() untuk bernavigasi ke named route anda, tanpa konteks (anda bisa memanggil route secara langsung dari kelas BLoC atau Controller), dan ketika aplikasi anda di-compile di web, route anda akan muncul di url <3 266 Dan sekarang, yang anda perlu lakukan adalah menggunakan Get.toNamed() untuk bernavigasi ke named route anda, tanpa konteks (anda bisa memanggil route secara langsung dari kelas BLoC atau Controller), dan ketika aplikasi anda di-compile di web, route anda akan muncul di url <3
252 267
253 ### Middleware 268 ### Middleware
@@ -315,7 +330,7 @@ class First extends StatelessWidget { @@ -315,7 +330,7 @@ class First extends StatelessWidget {
315 title: Text('Halaman Pertama'), 330 title: Text('Halaman Pertama'),
316 ), 331 ),
317 body: Center( 332 body: Center(
318 - child: RaisedButton( 333 + child: ElevatedButton(
319 child: Text('Pindah halaman'), 334 child: Text('Pindah halaman'),
320 onPressed: () { 335 onPressed: () {
321 Get.toNamed("/second"); 336 Get.toNamed("/second");
@@ -340,7 +355,7 @@ class Second extends StatelessWidget { @@ -340,7 +355,7 @@ class Second extends StatelessWidget {
340 title: Text('Halaman kedua'), 355 title: Text('Halaman kedua'),
341 ), 356 ),
342 body: Center( 357 body: Center(
343 - child: RaisedButton( 358 + child: ElevatedButton(
344 child: Text('Pindah halaman'), 359 child: Text('Pindah halaman'),
345 onPressed: () { 360 onPressed: () {
346 Get.toNamed("/third"); 361 Get.toNamed("/third");
@@ -359,7 +374,7 @@ class Third extends StatelessWidget { @@ -359,7 +374,7 @@ class Third extends StatelessWidget {
359 title: Text("Halaman ketiga"), 374 title: Text("Halaman ketiga"),
360 ), 375 ),
361 body: Center( 376 body: Center(
362 - child: RaisedButton( 377 + child: ElevatedButton(
363 onPressed: () { 378 onPressed: () {
364 Get.back(); 379 Get.back();
365 }, 380 },
@@ -430,7 +445,7 @@ Get.snackbar( @@ -430,7 +445,7 @@ Get.snackbar(
430 // Color leftBarIndicatorColor, 445 // Color leftBarIndicatorColor,
431 // List<BoxShadow> boxShadows, 446 // List<BoxShadow> boxShadows,
432 // Gradient backgroundGradient, 447 // Gradient backgroundGradient,
433 - // FlatButton mainButton, 448 + // TextButton mainButton,
434 // OnTap onTap, 449 // OnTap onTap,
435 // bool isDismissible, 450 // bool isDismissible,
436 // bool showProgressIndicator, 451 // bool showProgressIndicator,
@@ -486,12 +501,12 @@ Get.bottomSheet( @@ -486,12 +501,12 @@ Get.bottomSheet(
486 ListTile( 501 ListTile(
487 leading: Icon(Icons.music_note), 502 leading: Icon(Icons.music_note),
488 title: Text('Music'), 503 title: Text('Music'),
489 - onTap: () => {} 504 + onTap: () {}
490 ), 505 ),
491 ListTile( 506 ListTile(
492 leading: Icon(Icons.videocam), 507 leading: Icon(Icons.videocam),
493 title: Text('Video'), 508 title: Text('Video'),
494 - onTap: () => {}, 509 + onTap: () {},
495 ), 510 ),
496 ], 511 ],
497 ), 512 ),
@@ -520,7 +535,7 @@ Navigator( @@ -520,7 +535,7 @@ Navigator(
520 title: Text("Main"), 535 title: Text("Main"),
521 ), 536 ),
522 body: Center( 537 body: Center(
523 - child: FlatButton( 538 + child: TextButton(
524 color: Colors.blue, 539 color: Colors.blue,
525 onPressed: () { 540 onPressed: () {
526 Get.toNamed('/second', id:1); // pindah ke halaman bersarang anda menggunakan index 541 Get.toNamed('/second', id:1); // pindah ke halaman bersarang anda menggunakan index
@@ -80,9 +80,9 @@ Get.put<S>( @@ -80,9 +80,9 @@ Get.put<S>(
80 Get.lazyPut<ApiMock>(() => ApiMock()); 80 Get.lazyPut<ApiMock>(() => ApiMock());
81 81
82 Get.lazyPut<FirebaseAuth>( 82 Get.lazyPut<FirebaseAuth>(
83 - () => {  
84 - // 어떤 로직이 필요하다면 ...  
85 - return FirebaseAuth() 83 + () {
  84 + // 어떤 로직이 필요하다면 ...
  85 + return FirebaseAuth();
86 }, 86 },
87 tag: Math.random().toString(), 87 tag: Math.random().toString(),
88 fenix: true 88 fenix: true
@@ -308,7 +308,7 @@ getPages: [ @@ -308,7 +308,7 @@ getPages: [
308 GetPage( 308 GetPage(
309 name: '/', 309 name: '/',
310 page: () => HomeView(), 310 page: () => HomeView(),
311 - binding: BindingsBuilder(() => { 311 + binding: BindingsBuilder(() {
312 Get.lazyPut<ControllerX>(() => ControllerX()); 312 Get.lazyPut<ControllerX>(() => ControllerX());
313 Get.put<Service>(()=> Api()); 313 Get.put<Service>(()=> Api());
314 }), 314 }),
@@ -316,7 +316,7 @@ getPages: [ @@ -316,7 +316,7 @@ getPages: [
316 GetPage( 316 GetPage(
317 name: '/details', 317 name: '/details',
318 page: () => DetailsView(), 318 page: () => DetailsView(),
319 - binding: BindingsBuilder(() => { 319 + binding: BindingsBuilder(() {
320 Get.lazyPut<DetailsController>(() => DetailsController()); 320 Get.lazyPut<DetailsController>(() => DetailsController());
321 }), 321 }),
322 ), 322 ),
@@ -246,6 +246,23 @@ print(Get.parameters['user']); @@ -246,6 +246,23 @@ print(Get.parameters['user']);
246 // 출력: 34954 246 // 출력: 34954
247 ``` 247 ```
248 248
  249 +
  250 +또는 이와 같은 여러 매개 변수를 보냅니다.
  251 +
  252 +```dart
  253 +Get.toNamed("/profile/34954?flag=true");
  254 +```
  255 +
  256 +두 번째 화면에서 일반적으로 매개 변수별로 데이터를 가져옵니다.
  257 +
  258 +```dart
  259 +print(Get.parameters['user']);
  260 +print(Get.parameters['flag']);
  261 +// 출력: 34954 true
  262 +```
  263 +
  264 +
  265 +
249 이제 Get.toNamed()를 사용하여 어떤 context도 없이 명명된 라우트를 탐색하고 (BLoC 또는 Controller 클래스로 부터 직접 라우트를 호출할 수 있음) 앱이 웹으로 컴파일되면 경로는 url에 표시됩니다. <3 266 이제 Get.toNamed()를 사용하여 어떤 context도 없이 명명된 라우트를 탐색하고 (BLoC 또는 Controller 클래스로 부터 직접 라우트를 호출할 수 있음) 앱이 웹으로 컴파일되면 경로는 url에 표시됩니다. <3
250 267
251 ### 미들웨어 268 ### 미들웨어
@@ -313,7 +330,7 @@ class First extends StatelessWidget { @@ -313,7 +330,7 @@ class First extends StatelessWidget {
313 title: Text('First Route'), 330 title: Text('First Route'),
314 ), 331 ),
315 body: Center( 332 body: Center(
316 - child: RaisedButton( 333 + child: ElevatedButton(
317 child: Text('Open route'), 334 child: Text('Open route'),
318 onPressed: () { 335 onPressed: () {
319 Get.toNamed("/second"); 336 Get.toNamed("/second");
@@ -338,7 +355,7 @@ class Second extends StatelessWidget { @@ -338,7 +355,7 @@ class Second extends StatelessWidget {
338 title: Text('second Route'), 355 title: Text('second Route'),
339 ), 356 ),
340 body: Center( 357 body: Center(
341 - child: RaisedButton( 358 + child: ElevatedButton(
342 child: Text('Open route'), 359 child: Text('Open route'),
343 onPressed: () { 360 onPressed: () {
344 Get.toNamed("/third"); 361 Get.toNamed("/third");
@@ -357,7 +374,7 @@ class Third extends StatelessWidget { @@ -357,7 +374,7 @@ class Third extends StatelessWidget {
357 title: Text("Third Route"), 374 title: Text("Third Route"),
358 ), 375 ),
359 body: Center( 376 body: Center(
360 - child: RaisedButton( 377 + child: ElevatedButton(
361 onPressed: () { 378 onPressed: () {
362 Get.back(); 379 Get.back();
363 }, 380 },
@@ -428,7 +445,7 @@ Get.snackbar( @@ -428,7 +445,7 @@ Get.snackbar(
428 // Color leftBarIndicatorColor, 445 // Color leftBarIndicatorColor,
429 // List<BoxShadow> boxShadows, 446 // List<BoxShadow> boxShadows,
430 // Gradient backgroundGradient, 447 // Gradient backgroundGradient,
431 - // FlatButton mainButton, 448 + // TextButton mainButton,
432 // OnTap onTap, 449 // OnTap onTap,
433 // bool isDismissible, 450 // bool isDismissible,
434 // bool showProgressIndicator, 451 // bool showProgressIndicator,
@@ -484,12 +501,12 @@ Get.bottomSheet( @@ -484,12 +501,12 @@ Get.bottomSheet(
484 ListTile( 501 ListTile(
485 leading: Icon(Icons.music_note), 502 leading: Icon(Icons.music_note),
486 title: Text('Music'), 503 title: Text('Music'),
487 - onTap: () => {} 504 + onTap: () {}
488 ), 505 ),
489 ListTile( 506 ListTile(
490 leading: Icon(Icons.videocam), 507 leading: Icon(Icons.videocam),
491 title: Text('Video'), 508 title: Text('Video'),
492 - onTap: () => {}, 509 + onTap: () {},
493 ), 510 ),
494 ], 511 ],
495 ), 512 ),
@@ -518,7 +535,7 @@ Navigator( @@ -518,7 +535,7 @@ Navigator(
518 title: Text("Main"), 535 title: Text("Main"),
519 ), 536 ),
520 body: Center( 537 body: Center(
521 - child: FlatButton( 538 + child: TextButton(
522 color: Colors.blue, 539 color: Colors.blue,
523 onPressed: () { 540 onPressed: () {
524 Get.toNamed('/second', id:1); // index로 중첩된 경로를 탐색 541 Get.toNamed('/second', id:1); // index로 중첩된 경로를 탐색