Nipodemos

revised and ready to merge

@@ -766,7 +766,7 @@ interval(count1, (_) => print("interval $_"), time: Duration(seconds: 1)); @@ -766,7 +766,7 @@ interval(count1, (_) => print("interval $_"), time: Duration(seconds: 1));
766 '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. 766 '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.
767 767
768 - interval 768 - interval
769 -'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. debounce 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. 769 +'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.
770 770
771 771
772 ## Navigate with named routes: 772 ## Navigate with named routes:
1 ![](get.png) 1 ![](get.png)
2 2
3 -*Languages: [English](README.md), [Brazilian Portuguese](README.pt-br.md).* 3 +*Idiomas: [English](README.md), [Brazilian Portuguese](README.pt-br.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/Test,%20build%20and%20deploy/badge.svg) 6 ![building](https://github.com/jonataslaw/get/workflows/Test,%20build%20and%20deploy/badge.svg)
@@ -61,7 +61,7 @@ Essa biblioteca vai mudar a forma que você trabalha com o Framework e salvar se @@ -61,7 +61,7 @@ Essa biblioteca vai mudar a forma que você trabalha com o Framework e salvar se
61 - [Reactive State Manager - GetX](#reactive-state-manager---getx) 61 - [Reactive State Manager - GetX](#reactive-state-manager---getx)
62 - [Gerenciamento de dependências simples](#gerenciamento-de-dependências-simples) 62 - [Gerenciamento de dependências simples](#gerenciamento-de-dependências-simples)
63 - [Bindings](#bindings) 63 - [Bindings](#bindings)
64 - - [Para usar essa API você só precisa:](#para-usar-essa-api-você-só-precisa) 64 + - [Como utilizar:](#como-utilizar)
65 - [Workers](#workers) 65 - [Workers](#workers)
66 - [Navegar com rotas nomeadas](#navegar-com-rotas-nomeadas) 66 - [Navegar com rotas nomeadas](#navegar-com-rotas-nomeadas)
67 - [Enviar dados para rotas nomeadas](#enviar-dados-para-rotas-nomeadas) 67 - [Enviar dados para rotas nomeadas](#enviar-dados-para-rotas-nomeadas)
@@ -69,9 +69,8 @@ Essa biblioteca vai mudar a forma que você trabalha com o Framework e salvar se @@ -69,9 +69,8 @@ Essa biblioteca vai mudar a forma que você trabalha com o Framework e salvar se
69 - [Middleware](#middleware) 69 - [Middleware](#middleware)
70 - [Change Theme](#change-theme) 70 - [Change Theme](#change-theme)
71 - [Configurações Globais Opcionais](#configurações-globais-opcionais) 71 - [Configurações Globais Opcionais](#configurações-globais-opcionais)
72 - - [Optional Global Settings](#optional-global-settings)  
73 - [Outras APIs avançadas e Configurações Manuais](#outras-apis-avançadas-e-configurações-manuais) 72 - [Outras APIs avançadas e Configurações Manuais](#outras-apis-avançadas-e-configurações-manuais)
74 - - [Navigators Aninhados](#navigators-aninhados) 73 + - [Nested Navigators](#nested-navigators)
75 74
76 75
77 76
@@ -171,7 +170,7 @@ Get.to(HomePage()); @@ -171,7 +170,7 @@ Get.to(HomePage());
171 170
172 ### SnackBars 171 ### SnackBars
173 172
174 -Para ter um `SnackBar` simples no Flutter, você precisa pegar o `context` do Scaffold, ou você precisa de uma `GlobalKey` atrelada ao seu Scaffold. 173 +Para ter um `SnackBar` simples no Flutter, você precisa do `context` do Scaffold, ou uma `GlobalKey` atrelada ao seu Scaffold.
175 ```dart 174 ```dart
176 final snackBar = SnackBar( 175 final snackBar = SnackBar(
177 content: Text('Olá!'), 176 content: Text('Olá!'),
@@ -195,8 +194,7 @@ Com Get, tudo que você precisa fazer é chamar `Get.snackbar()` de qualquer lug @@ -195,8 +194,7 @@ Com Get, tudo que você precisa fazer é chamar `Get.snackbar()` de qualquer lug
195 ```dart 194 ```dart
196 Get.snackbar( 195 Get.snackbar(
197 "Ei, eu sou uma SnackBar Get!", // título 196 "Ei, eu sou uma SnackBar Get!", // título
198 - "É inacreditável! Eu estou usando uma SnackBar sem context, sem " +  
199 - "boilerplate, sem Scaffold, é algo realmente maravilhoso!", // mensagem 197 + "É inacreditável! Eu estou usando uma SnackBar sem context, sem boilerplate, sem Scaffold!", // mensagem
200 icon: Icon(Icons.alarm), 198 icon: Icon(Icons.alarm),
201 shouldIconPulse: true, 199 shouldIconPulse: true,
202 onTap:(){}, 200 onTap:(){},
@@ -242,7 +240,7 @@ Get.snackbar( @@ -242,7 +240,7 @@ Get.snackbar(
242 // Form userInputForm 240 // Form userInputForm
243 /////////////////////////////////// 241 ///////////////////////////////////
244 ``` 242 ```
245 -Se você prefere a SnackBar tradicional, ou quer customizar por completo, como por exemplo fazer ele ter só uma linha (`Get.snackbar` tem os parâmetros `title` e `message` obrigatórios), você pode usar `Get.rawSnackbar();` que fornece a RAW API na qual `Get.snackbar` foi contruído. 243 +Se você prefere a SnackBar tradicional, ou quer customizar por completo, como por exemplo fazer ele ter uma só linha (`Get.snackbar` tem os parâmetros `title` e `message` obrigatórios), você pode usar `Get.rawSnackbar();` que fornece a API bruta na qual `Get.snackbar` foi contruído.
246 244
247 ### Dialogs 245 ### Dialogs
248 246
@@ -260,7 +258,7 @@ Get.defaultDialog( @@ -260,7 +258,7 @@ Get.defaultDialog(
260 ``` 258 ```
261 Você também pode usar `Get.generalDialog` em vez de `showGeneralDialog`. 259 Você também pode usar `Get.generalDialog` em vez de `showGeneralDialog`.
262 260
263 -Para todos os outros Widgets dialog do Flutter, incluindo os do Cupertino, você pode usar `Get.overlayContext` em vez do `context`, e abrir em qualquer lugar do seu código. 261 +Para todos os outros Widgets do tipo dialog do Flutter, incluindo os do Cupertino, você pode usar `Get.overlayContext` em vez do `context`, e abrir em qualquer lugar do seu código.
264 262
265 Para widgets que não usam `overlayContext`, você pode usar `Get.context`. Esses dois contextos vão funcionar em 99% dos casos para substituir o context da sua UI, exceto em casos onde o `inheritedWidget` é usado sem a navigation context. 263 Para widgets que não usam `overlayContext`, você pode usar `Get.context`. Esses dois contextos vão funcionar em 99% dos casos para substituir o context da sua UI, exceto em casos onde o `inheritedWidget` é usado sem a navigation context.
266 264
@@ -411,7 +409,7 @@ Quando você pressionar o FloatingActionButton, todos os widgets que estão escu @@ -411,7 +409,7 @@ Quando você pressionar o FloatingActionButton, todos os widgets que estão escu
411 409
412 #### Sem StatefulWidget; 410 #### Sem StatefulWidget;
413 Usar StatefulWidget's significa guardar o estado de telas inteiras desnecessariamente, mesmo porque se você precisa recarregar minimamente algum widget, você vai incorporá-lo num Consumer/Observer/BlocProvider/GetBuilder/GetX/Obx, que vai ser outro StatefulWidget. 411 Usar StatefulWidget's significa guardar o estado de telas inteiras desnecessariamente, mesmo porque se você precisa recarregar minimamente algum widget, você vai incorporá-lo num Consumer/Observer/BlocProvider/GetBuilder/GetX/Obx, que vai ser outro StatefulWidget.
414 -A classe StatefulWidget é maior que a classe StatelessWidget, o que vai alocar mais memória, e isso pode não fazer uma diferença significativa com uma ou duas classes, mas com certeza vai quando você tiver 100 delas! 412 +A classe StatefulWidget é maior que a classe StatelessWidget, o que vai alocar mais memória, e isso pode não fazer uma diferença significativa com uma ou duas classes, mas com certeza fará quando você tiver 100 delas!
415 413
416 A não ser que você precise usar um mixin, como o `TickerProviderStateMixin`, será totalmente desnecessário usar um StatefulWidget com o Get. 414 A não ser que você precise usar um mixin, como o `TickerProviderStateMixin`, será totalmente desnecessário usar um StatefulWidget com o Get.
417 415
@@ -433,9 +431,9 @@ void onInit() { @@ -433,9 +431,9 @@ void onInit() {
433 super.onInit(); 431 super.onInit();
434 } 432 }
435 ``` 433 ```
436 -* Nota: Se você quiser rodar um método no momento que o controller é chamado pela primeira vez, você NÃO PRECISA usar construtores para isso, na verdade, usando um package que é focado em performance como o Get, isso chega no limite de má prática, porque se desvia da lógica que os controllers são criados ou alocados (Se você criar uma instância desse controller, o construtor vai ser chamado imediatamente, e ele será populado antes de ser usado, ou seja, você está alocando memória e não está utilizando, o que fere os princípios desse package). Os métodos `onInit()` e `onClose()` foram criados para isso, eles serão chamados quando o controller é criado, ou usados pela primeira vez, dependendo de como você está utilizando o Get (lazyPut ou não). Se quiser, por exemplo, fazer uma chamada para sua API para popular dados, você pode esquecer do estilo antigo de usar `initState()/dispose()`, apenas comece sua chamada para a api no `onInit`, e apenas se você precisar executar algum comando como fechar stream, use o `onClose()`. 434 +* Nota: Se você quiser executar um método no momento que o controller é chamado pela primeira vez, você NÃO precisa usar construtores para isso, na verdade, usando um package que é focado em performance como o Get, isso chega no limite de má prática, porque se desvia da lógica de que os controllers são criados ou alocados (Se você criar uma instância desse controller, o construtor vai ser chamado imediatamente, e ele será populado antes de ser usado, ou seja, você está alocando memória e não está utilizando, o que fere os princípios desse package). Os métodos `onInit()` e `onClose()` foram criados para isso, eles serão chamados quando o controller é criado, ou usados pela primeira vez, dependendo de como você está utilizando o Get (lazyPut ou não). Se quiser, por exemplo, fazer uma chamada para sua API para popular dados, você pode esquecer do estilo antigo de usar `initState()/dispose()`, apenas comece sua chamada para a api no `onInit`, e apenas se você precisar executar algum comando como fechar stream, use o `onClose()`.
437 435
438 -O propósito desse package é precisamente te dar uma solução completa para navegação de rotas, gerenciamente de dependências e estados, usando o mínimo possível de dependências, com um alto grau de decoupling. Get envolve em todas as APIs de baixo e alto nível dentro de si mesmo, para ter certeza que você irá trabalhar com o mínimo possível de coupling. 436 +O propósito desse package é precisamente te dar uma solução completa para navegação de rotas, gerenciamente de dependências e estados, usando o mínimo possível de dependências, com um alto grau de desacoplamento. Get envolve em todas as APIs de baixo e alto nível dentro de si mesmo, para ter certeza que você irá trabalhar com o mínimo possível de acoplamento.
439 437
440 Nós centralizamos tudo em um único package. Dessa forma, você pode colocar somente widgets na sua view, e o controller pode ter só lógica de negócio, sem depender de nenhum elemento da View. Isso fornece um ambiente de trabalho muito mais limpo, para que parte do seu time possa trabalhar apenas com os widgets, sem se preocupar sobre enviar dados para o controller, e outra parte se preocupe apenas com a lógica de negócio, sem depender de nenhum elemento da view. 438 Nós centralizamos tudo em um único package. Dessa forma, você pode colocar somente widgets na sua view, e o controller pode ter só lógica de negócio, sem depender de nenhum elemento da View. Isso fornece um ambiente de trabalho muito mais limpo, para que parte do seu time possa trabalhar apenas com os widgets, sem se preocupar sobre enviar dados para o controller, e outra parte se preocupe apenas com a lógica de negócio, sem depender de nenhum elemento da view.
441 439
@@ -443,9 +441,9 @@ Então, para simplificar isso: @@ -443,9 +441,9 @@ Então, para simplificar isso:
443 441
444 Você não precisa chamar métodos no `initState()` e enviá-los para seu controller via parâmetros, nem precisa do construtor do controller pra isso, você possui o método `onInit()` que é chamado no momento certo para você inicializar seus services. 442 Você não precisa chamar métodos no `initState()` e enviá-los para seu controller via parâmetros, nem precisa do construtor do controller pra isso, você possui o método `onInit()` que é chamado no momento certo para você inicializar seus services.
445 443
446 -Você não precisa chamar o método `dispose()`, você tem o método `onClose()` que vai ser chamado no momento exato quando seu controller não for mais necessário e será removido da memória. Dessa forma, você pode deixar views somente para os widgets, e o controller só para as regras de negócio. 444 +Você não precisa chamar o método `dispose()`, você tem o método `onClose()` que vai ser chamado no momento exato quando seu controller não for mais necessário e será removido da memória. Dessa forma, você pode deixar a view somente para os widgets, e o controller só para as regras de negócio.
447 445
448 -Não chame o método `dispose()` dentro do GetController, não vai fazer nada, lembre-se que o controller não é um widget, você não deveria usar o dispose lá, e esse método será automatacimente e inteligentemente removido da memória pelo Get. Se você usou algum stream no controller e quer fechá-lo, apensar insira o método para fechar os stream dentro do método `onClose()`. 446 +Não chame o método `dispose()` dentro do GetController, não vai fazer nada. Lembre-se que o controller não é um widget, você não deveria usar o dispose lá, e esse método será automaticamente e inteligentemente removido da memória pelo Get. Se você usou algum stream no controller e quer fechá-lo, apenas insira o método para fechar os stream dentro do método `onClose()`.
449 447
450 Exemplo: 448 Exemplo:
451 ```dart 449 ```dart
@@ -453,7 +451,7 @@ class Controller extends GetController { @@ -453,7 +451,7 @@ class Controller extends GetController {
453 var user = StreamController<User>(); 451 var user = StreamController<User>();
454 var name = StreamController<String>(); 452 var name = StreamController<String>();
455 453
456 - /// close stream = onClose method, not dispose. 454 + /// fechar stream = método onClose(), não dispose().
457 @override 455 @override
458 void onClose() { 456 void onClose() {
459 user.close(); 457 user.close();
@@ -465,7 +463,7 @@ class Controller extends GetController { @@ -465,7 +463,7 @@ class Controller extends GetController {
465 Ciclo de vida do controller: 463 Ciclo de vida do controller:
466 * `onInit()`: Onde ele é criado. 464 * `onInit()`: Onde ele é criado.
467 * `onClose()`: Onde ele é fechado para fazer mudanças em preparação para o método delete() 465 * `onClose()`: Onde ele é fechado para fazer mudanças em preparação para o método delete()
468 -* deleted: Você não tem mais acesso a essa API porque ela está literalmente removendo o controller da memória. Está literalmente deletado, sem deixar rastros. 466 +* deleted: Você não tem acesso a essa API porque ela está literalmente removendo o controller da memória. Está literalmente deletado, sem deixar rastros.
469 467
470 ##### Formas de uso: 468 ##### Formas de uso:
471 469
@@ -547,13 +545,13 @@ Você também pode impor condições para o update acontecer: @@ -547,13 +545,13 @@ Você também pode impor condições para o update acontecer:
547 update(this,['text'], counter < 10); 545 update(this,['text'], counter < 10);
548 ``` 546 ```
549 547
550 -GetX faz isso automaticamente e somente reconstrói o widget que usa a exata variável que foi alterada. Se você alterar o valor davariável para o mesmo valor que ela já era e isso não sugira uma mudança de estado, GetX não vai reconstruir esse widget, economizando memória e ciclos de CPU (Ex: 3 está sendo mostrado na tela, e você muda a variável para ter o valor 3 denovo. Na maioria dos gerenciadores de estado, isso vai causar uma reconstrução do widget, mas com o GetX o widget só vai reconstruir se de fato o estado mudou). 548 +GetX faz isso automaticamente e somente reconstrói o widget que usa a exata variável que foi alterada. Se você alterar o valor da variável para o mesmo valor que ela era anteriormente e isso não sugira uma mudança de estado, GetX não vai reconstruir esse widget, economizando memória e ciclos de CPU (Ex: 3 está sendo mostrado na tela, e você muda a variável para ter o valor 3 denovo. Na maioria dos gerenciadores de estado, isso vai causar uma reconstrução do widget, mas com o GetX o widget só vai reconstruir se de fato o estado mudou).
551 549
552 GetBuilder é focado precisamente em múltiplos controles de estados. Imagine que você adicionou 30 produtos ao carrinho, você clica pra deletar um deles, e ao mesmo tempos a lista é atualizada, o preço é atualizado e o pequeno círculo mostrando a quantidade de produtos é atualizado. Esse tipo de abordagem faz o GetBuilder excelente, porque ele agupa estados e muda todos eles de uma vez sem nenhuma "lógica computacional" pra isso. GetBuilder foi criado com esse tipo de situação em mente, já que pra mudanças de estados simples, você pode simplesmente usar o `setState()`, e você não vai precisar de um gerenciador de estado para isso. Porém, há situações onde você quer somente que o widget onde uma certa variável mudou seja reconstruído, e isso é o que o GetX faz com uma maestria nunca vista antes. 550 GetBuilder é focado precisamente em múltiplos controles de estados. Imagine que você adicionou 30 produtos ao carrinho, você clica pra deletar um deles, e ao mesmo tempos a lista é atualizada, o preço é atualizado e o pequeno círculo mostrando a quantidade de produtos é atualizado. Esse tipo de abordagem faz o GetBuilder excelente, porque ele agupa estados e muda todos eles de uma vez sem nenhuma "lógica computacional" pra isso. GetBuilder foi criado com esse tipo de situação em mente, já que pra mudanças de estados simples, você pode simplesmente usar o `setState()`, e você não vai precisar de um gerenciador de estado para isso. Porém, há situações onde você quer somente que o widget onde uma certa variável mudou seja reconstruído, e isso é o que o GetX faz com uma maestria nunca vista antes.
553 551
554 Dessa forma, se você quiser controlar individualmente, você pode assinalar ID's para isso, ou usar GetX. Isso é com você, apenas lembre-se que quando mais "widgets individuais" você tiver, mais a performance do GetX vai se sobressair. Mas o GetBuilder vai ser superior quando há multiplas mudanças de estado. 552 Dessa forma, se você quiser controlar individualmente, você pode assinalar ID's para isso, ou usar GetX. Isso é com você, apenas lembre-se que quando mais "widgets individuais" você tiver, mais a performance do GetX vai se sobressair. Mas o GetBuilder vai ser superior quando há multiplas mudanças de estado.
555 553
556 -Você pode usar os dois em qualquer situação, mas se quiser refinar a aplicação para a melhor performance possível, eu diria isso: se as suas variáveis são alteradas em momentos diferentes, use GetX, porque não tem competição para isso quando o widget é pra reconstruir somente o que é necessário. Se você não precisa de IDs únicas, porque todas as suas variáveis serão alteradas quando você fazer uma ação, use GetBuilder, porque é um atualizador de estado em blocos simples, feito com apenas algumas linhas de código, para fazer justamente o que ele promete fazer: atualizar estado em blocos. Não há forma de comparar RAM, CPU, etc de um gerenciador de estado gigante com um simples StatefulWidget (como GetBuilder) que é atualizado quando você chama `update(this)`. Foi feito de uma forma simples, para ter o mínimo de lógica computacional, somente para cumprir um único papel e gastar o mínimo de recursos possível. 554 +Você pode usar os dois em qualquer situação, mas se quiser refinar a aplicação para a melhor performance possível, eu diria isso: se as suas variáveis são alteradas em momentos diferentes, use GetX, porque não tem competição para isso quando o widget é para reconstruir somente o que é necessário. Se você não precisa de IDs únicas, porque todas as suas variáveis serão alteradas quando você fazer uma ação, use GetBuilder, porque é um atualizador de estado em blocos simples, feito com apenas algumas linhas de código, para fazer justamente o que ele promete fazer: atualizar estado em blocos. Não há forma de comparar RAM, CPU, etc de um gerenciador de estado gigante com um simples StatefulWidget (como GetBuilder) que é atualizado quando você chama `update(this)`. Foi feito de uma forma simples, para ter o mínimo de lógica computacional, somente para cumprir um único papel e gastar o mínimo de recursos possível.
557 Se você quer um gerenciador de estados poderoso, você pode ir sem medo para o GetX. Ele não funciona com variáveis, mas sim fluxos. Tudo está em seus streams por baixo dos panos. Você pode usar `rxDart` em conjunto com ele, porque tudo é um stream, você pode ouvir o evento de cada "variável", porque tudo é um stream, é literalmente BLoc, só que mais fácil que MobX e sem code generators ou decorations. 555 Se você quer um gerenciador de estados poderoso, você pode ir sem medo para o GetX. Ele não funciona com variáveis, mas sim fluxos. Tudo está em seus streams por baixo dos panos. Você pode usar `rxDart` em conjunto com ele, porque tudo é um stream, você pode ouvir o evento de cada "variável", porque tudo é um stream, é literalmente BLoc, só que mais fácil que MobX e sem code generators ou decorations.
558 556
559 ## Reactive State Manager - GetX 557 ## Reactive State Manager - GetX
@@ -575,26 +573,26 @@ int get sum => count1.value + count2.value; @@ -575,26 +573,26 @@ int get sum => count1.value + count2.value;
575 ```dart 573 ```dart
576 GetX<Controller>( 574 GetX<Controller>(
577 builder: (_) { 575 builder: (_) {
578 - print("count 1 rebuild"); 576 + print("count 1 foi reconstruído");
579 return Text('${_.count1.value}'); 577 return Text('${_.count1.value}');
580 }, 578 },
581 ), 579 ),
582 GetX<Controller>( 580 GetX<Controller>(
583 builder: (_) { 581 builder: (_) {
584 - print("count 2 rebuild"); 582 + print("count 2 foi reconstruído");
585 return Text('${_.count2.value}'); 583 return Text('${_.count2.value}');
586 }, 584 },
587 ), 585 ),
588 GetX<Controller>( 586 GetX<Controller>(
589 builder: (_) { 587 builder: (_) {
590 - print("sum rebuild"); 588 + print("sum foi reconstruído");
591 return Text('${_.sum}'); 589 return Text('${_.sum}');
592 }, 590 },
593 ), 591 ),
594 ``` 592 ```
595 Se nós incrementarmos o número do `count1`, somente `count1` e `sum` serão reconstruídos, porque `count1` agora tem um valor de 1, e 1 + 0 = 1, alterando o valor do `sum`. 593 Se nós incrementarmos o número do `count1`, somente `count1` e `sum` serão reconstruídos, porque `count1` agora tem um valor de 1, e 1 + 0 = 1, alterando o valor do `sum`.
596 594
597 -Se nós mudarmos `count2`, somente `count2` e `sum` serão reconstruídos, porque o valor do 2 mudou, e o resultado da sum é agora 2. 595 +Se nós mudarmos `count2`, somente `count2` e `sum` serão reconstruídos, porque o valor do 2 mudou, e o resultado da variável `sum` é agora 2.
598 596
599 Se definirmos o valor de `count1` para 1, nenhum widget será reconstruído, porque o valor já era 1. 597 Se definirmos o valor de `count1` para 1, nenhum widget será reconstruído, porque o valor já era 1.
600 598
@@ -675,17 +673,17 @@ A api `assign` vai limpar sua lista e adicionar um único objeto que você quer. @@ -675,17 +673,17 @@ A api `assign` vai limpar sua lista e adicionar um único objeto que você quer.
675 673
676 A api `assignAll` vai limpar sua lista e vai adicionar objetos `Iterable` que você precisa. 674 A api `assignAll` vai limpar sua lista e vai adicionar objetos `Iterable` que você precisa.
677 675
678 -Nós poderíamos remover a obrigação de usar o value em String e int com uma simples decoration e code generator, mas o propósito desse package é precisamente não precisar de nenhuma dependência externa. É para oferecer um ambiente pronto para programar, envolvendo os essenciais (gerenciamento de rotas, dependencias e estados), numa forma simples, leve e performática sem precisar de packages externos. Você pode literalmente adicionar 3 letras e um ':' no seu pubspec.yaml e começar a programar. Todas as soluções incluídas por padrão, miram em facilidade, produtividade e performance. 676 +Nós poderíamos remover a obrigação de usar o value em String e int com uma simples decoration e code generator, mas o propósito desse package é precisamente não precisar de nenhuma dependência externa. É para oferecer um ambiente pronto para programar, envolvendo os essenciais (gerenciamento de rotas, dependências e estados), numa forma simples, leve e performática sem precisar de packages externos. Você pode literalmente adicionar 3 letras e um ':' no seu pubspec.yaml e começar a programar. Todas as soluções incluídas por padrão, miram em facilidade, produtividade e performance.
679 677
680 O peso total desse package é menor que o de um único gerenciador de estado, mesmo sendo uma solução completa, e isso é o que você precisa entender. 678 O peso total desse package é menor que o de um único gerenciador de estado, mesmo sendo uma solução completa, e isso é o que você precisa entender.
681 679
682 -Se você está incomodado com o `.value`, e gosta de code generator, MobX é uma excelente alternativa, e você pode usá-lo em conjunto com o Get. PAra aquele que querem adicionar uma única dependência no pubspec a começar a programar sem se preocupar sobre a versão do package sendo incompatível com outra, ou se o erro de uma atualização do estado está vind do gerenciador de estado ou da dependência, ou ainda, não quer se preocupar com a disponibilidade de controllers, prefere literalmente "só programar", Get é perfeito. 680 +Se você está incomodado com o `.value`, e gosta de code generator, MobX é uma excelente alternativa, e você pode usá-lo em conjunto com o Get. Para aqueles que querem adicionar uma única dependência no pubspec.yaml e começar a programar sem se preocupar sobre a versão de um package sendo incompatível com outra, ou se o erro de uma atualização do estado está vindo do gerenciador de estado ou da dependência, ou ainda, não quer se preocupar com a disponibilidade de controllers, prefere literalmente "só programar", Get é perfeito.
683 681
684 -Agora se você não tem problemas com o code generator do MobX, ou não vê problema no boilerplate do BLoc, você pode simplesmente usar o Get para rotas, e esquecer que nele existe um gerenciado de estado. Get nasceu da necessidade, minha empresa tinha um projeto com mais de 90 controllers e o code generator simplesmente levava mais de 30 minutos para completar suas tarefas depois de um `flutter clean` numa máquina razoavelmente boa, se o seu projeto tem 5, 10, 15 controllers, qualquer gerenciador de estado vai ter satisfazer. 682 +Agora se você não tem problemas com o code generator do MobX, ou não vê problema no boilerplate do BLoc, você pode simplesmente usar o Get para rotas, e esquecer que nele existe um gerenciador de estado. Get nasceu da necessidade, minha empresa tinha um projeto com mais de 90 controllers e o code generator simplesmente levava mais de 30 minutos para completar suas tarefas depois de um `flutter clean` numa máquina razoavelmente boa, se o seu projeto tem 5, 10, 15 controllers, qualquer gerenciador de estado vai ter satisfazer.
685 683
686 Se você tem um projeto absurdamente grande, e code generator é um problema para você, então você foi presenteado com essa solução que é o Get. 684 Se você tem um projeto absurdamente grande, e code generator é um problema para você, então você foi presenteado com essa solução que é o Get.
687 685
688 -Obviamente, se alguém quiser contribuir para o projeto e criar um code generator, or algo similar, eu vou linkar o README como uma alternativa, minha necessidade não é a necessidade de todos os devs, mas por agora eu digo: há boas solução que já fazem isso, como MobX. 686 +Obviamente, se alguém quiser contribuir para o projeto e criar um code generator, or algo similar, eu vou linkar no README como uma alternativa, minha necessidade não é a necessidade de todos os devs, mas por agora eu digo: há boas soluções que já fazem isso, como MobX.
689 687
690 Tipagem no Get usando Bindings é desnecessário. Você pode usar o widget `Obx()` em vez do GetX, e ele só recebe a função anônima que cria o widget. 688 Tipagem no Get usando Bindings é desnecessário. Você pode usar o widget `Obx()` em vez do GetX, e ele só recebe a função anônima que cria o widget.
691 689
@@ -693,7 +691,7 @@ Tipagem no Get usando Bindings é desnecessário. Você pode usar o widget `Obx( @@ -693,7 +691,7 @@ Tipagem no Get usando Bindings é desnecessário. Você pode usar o widget `Obx(
693 691
694 * Nota: Se você está usando o gerenciado de estado do Get, você não precisa se preocupar com isso, só leia a documentação, mas dê uma atenção a api `Bindings`, que vai fazer tudo isso automaticamente para você. 692 * Nota: Se você está usando o gerenciado de estado do Get, você não precisa se preocupar com isso, só leia a documentação, mas dê uma atenção a api `Bindings`, que vai fazer tudo isso automaticamente para você.
695 693
696 -Já está usando o Get e quer fazer seu projeto o melhor possível? Get tem um gerenciado de dependência simpels e poderoso que permite você pegar a mesma classe que seu Bloc ou Controller com apenas uma linha de código, sem Provider context, sem inheritedWidget: 694 +Já está usando o Get e quer fazer seu projeto o melhor possível? Get tem um gerenciador de dependência simples e poderoso que permite você pegar a mesma classe que seu Bloc ou Controller com apenas uma linha de código, sem Provider context, sem inheritedWidget:
697 695
698 ```dart 696 ```dart
699 Controller controller = Get.put(Controller()); // Em vez de Controller controller = Controller(); 697 Controller controller = Get.put(Controller()); // Em vez de Controller controller = Controller();
@@ -706,7 +704,7 @@ Para que então você possa usar seu controller (ou uma classe Bloc) normalmente @@ -706,7 +704,7 @@ Para que então você possa usar seu controller (ou uma classe Bloc) normalmente
706 controller.fetchApi(); 704 controller.fetchApi();
707 ``` 705 ```
708 706
709 -Agora, imagine que você navegou por inúmeras rotas e precisa de dados que foram deixados para trás em seu controlador; você precisaria de um gerenciador de estado combinado com o Provider ou Get_it, correto? Não com Get. Você só precisa pedir ao Get para "procurar" pelo seu controlador, você não precisa de nenhuma dependência adicional para isso: 707 +Agora, imagine que você navegou por inúmeras rotas e precisa de dados que foram deixados para trás em seu controlador. Você precisaria de um gerenciador de estado combinado com o Provider ou Get_it, correto? Não com Get. Você só precisa pedir ao Get para "procurar" pelo seu controlador, você não precisa de nenhuma dependência adicional para isso:
710 708
711 ```dart 709 ```dart
712 Controller controller = Get.find(); 710 Controller controller = Get.find();
@@ -722,7 +720,7 @@ Text(controller.textFromApi); @@ -722,7 +720,7 @@ Text(controller.textFromApi);
722 Procurando por `lazyLoading`?(carregar somente quando for usar) Você pode declarar todos os seus controllers, e eles só vão ser inicializados e chamados quando alguém precisar. Você pode fazer isso 720 Procurando por `lazyLoading`?(carregar somente quando for usar) Você pode declarar todos os seus controllers, e eles só vão ser inicializados e chamados quando alguém precisar. Você pode fazer isso
723 ```dart 721 ```dart
724 Get.lazyPut<Service>(()=> ApiMock()); 722 Get.lazyPut<Service>(()=> ApiMock());
725 -/// ApiMock só sera chamado quando alguém usar o Get.find<Service> pela primeira vez 723 +/// ApiMock só será chamado quando alguém usar o Get.find<Service> pela primeira vez
726 ``` 724 ```
727 725
728 Para remover a instância do Get: 726 Para remover a instância do Get:
@@ -733,7 +731,7 @@ Get.delete<Controller>(); @@ -733,7 +731,7 @@ Get.delete<Controller>();
733 ## Bindings 731 ## Bindings
734 Um dos grandes diferenciais desse package, talvez, seja a possibilidade de integração total com rotas, gerenciador de estado e gerenciador de dependências. 732 Um dos grandes diferenciais desse package, talvez, seja a possibilidade de integração total com rotas, gerenciador de estado e gerenciador de dependências.
735 733
736 -Quando uma rota é removida da stack, todos os controllers, variáveis e instâncias de objetos relacionados com ela serão removidos da memória. Se você está usando streams ou timer, eles serão fechados automaticamente, e você não precisa se preocupar com nada disso. 734 +Quando uma rota é removida da stack, todos os controllers, variáveis e instâncias de objetos relacionados com ela são removidos da memória. Se você está usando streams ou timer, eles serão fechados automaticamente, e você não precisa se preocupar com nada disso.
737 735
738 Na versão 2.10 Get implementou completamente a API Bindings. 736 Na versão 2.10 Get implementou completamente a API Bindings.
739 737
@@ -745,8 +743,8 @@ Isso permite Get saber qual tela está sendo mostrada quando um controller parti @@ -745,8 +743,8 @@ Isso permite Get saber qual tela está sendo mostrada quando um controller parti
745 743
746 Somando a isso, a classe Binding vai permitir que você tenha um controle de configuração SmartManager. Você pode configurar as dependências que serão organizadas quando for remover a rota da stack, ou quando o widget que usa ele é definido, ou nada disso. Você vai ter gerenciador de dependências inteligente trabalhando para você, e você pode configurá-lo como quiser. 744 Somando a isso, a classe Binding vai permitir que você tenha um controle de configuração SmartManager. Você pode configurar as dependências que serão organizadas quando for remover a rota da stack, ou quando o widget que usa ele é definido, ou nada disso. Você vai ter gerenciador de dependências inteligente trabalhando para você, e você pode configurá-lo como quiser.
747 745
748 -#### Para usar essa API você só precisa:  
749 -* Criar uma classe que implementa a Bindings 746 +### Como utilizar:
  747 +* Para usar essa API você só precisa criar uma classe que implementa a Bindings:
750 748
751 ```dart 749 ```dart
752 class HomeBinding implements Bindings {} 750 class HomeBinding implements Bindings {}
@@ -778,7 +776,7 @@ Usando rotas normais: @@ -778,7 +776,7 @@ Usando rotas normais:
778 Get.to(Home(), binding: HomeBinding()); 776 Get.to(Home(), binding: HomeBinding());
779 ``` 777 ```
780 778
781 -Então, você não vai precisar se preocupar com gereciamento da memória da sua aplicação mais, Get vai fazer para você. 779 +Então, você não vai precisar se preocupar com gerenciamento da memória da sua aplicação mais, Get vai fazer para você.
782 780
783 781
784 ## Workers 782 ## Workers
@@ -787,29 +785,27 @@ Workers vai te dar suporte, ativando callbacks específicos quando um evento oco @@ -787,29 +785,27 @@ Workers vai te dar suporte, ativando callbacks específicos quando um evento oco
787 ```dart 785 ```dart
788 /// Chamada toda vez que a variável for alterada 786 /// Chamada toda vez que a variável for alterada
789 ever(count1, (value) => print("novo valor: $value")); 787 ever(count1, (value) => print("novo valor: $value"));
  788 +
790 /// Chamada apenas na primeira vez que a variável for alterada 789 /// Chamada apenas na primeira vez que a variável for alterada
791 once(count1, (value) => print("novo valor: $value (não vai mudar mais)")); 790 once(count1, (value) => print("novo valor: $value (não vai mudar mais)"));
  791 +
792 /// Anti DDos - Chamada toda vez que o usuário parar de digitar por 1 segundo, por exemplo. 792 /// Anti DDos - Chamada toda vez que o usuário parar de digitar por 1 segundo, por exemplo.
793 debounce(count1, (value) => print("debouce $value"), time: Duration(seconds: 1)); 793 debounce(count1, (value) => print("debouce $value"), time: Duration(seconds: 1));
  794 +
794 /// Ignore todas as mudanças num período de 1 segundo. 795 /// Ignore todas as mudanças num período de 1 segundo.
795 interval(count1, (value) => print("interval $value"), time: Duration(seconds: 1)); 796 interval(count1, (value) => print("interval $value"), time: Duration(seconds: 1));
796 ``` 797 ```
797 -- ever 798 +- **ever**
798 é chamado toda vez que a variável mudar de valor. É só isso. 799 é chamado toda vez que a variável mudar de valor. É só isso.
799 800
800 -- once 801 +- **once**
801 é chamado somente na primeira vez que a variável mudar de valor. 802 é chamado somente na primeira vez que a variável mudar de valor.
802 803
803 -- debounce  
804 -É muito útil em funções de pesquisa, onde você somente quer que a API seja chamada depois que o usuário terminar de digitar. Normalmente, se o usuário digitar "Jonny", será feita 5 requests na sua API, pela letra 'J', 'o', 'n', 'n' e'y'. Com o debounce isso não acontece, porque você tem a sua disposição uma função que só fazer a pesquisa na api quando o usuário parar de digitar. O debounce é bom para táticas anti-DDos, para funções de pesquisa em que cada letra digitada causaria um request na API. Debounce vai esperar o usário parar de digitar o nome, para então fazer o request para API.  
805 -  
806 -- interval  
807 -é diferente do debounce. quando se usa debounce , se o usuário fizer 1000 mudanças numa variável em 1 segundo, o debounce só computa o último depois de um tempo estipulado ( o padrão é 800 milisegundos). Interval por outro lado vai ignorar todas as ações do usuário pelo período estipulado. Se o interval for de 1 segundo, então ele só conseguirá enviar 60 eventos por segundo. Se for 3 segundos de prazo, então o interval vai enviar 20 eventos por minuto (diferente do debounce que só enviaria o evento depois do prazo estipulado acabar). Isso é recomendado para evitar abuso, em funções que o usuário pode clicar rapidamente em algo para ter uma vantagem. Para exemplificar, imagine que o usuário pode ganhar moedas clicando num botão. Se ele clicar 300 vezes no mesmo minuto, ele vai ganhar 300 moedas. Usando o interval, você pode definir um prazo de 1 segundo, e mesmo se ele clicasse 300 vezes em um minuto, ele ganharia apenas 60 moedas. Se fosse usado o debounce, o usuário ganharia apenas 1 moeda, porque só é executado quando o usuário para de clicar por um prazo estabelecido.  
808 -  
809 -  
810 -  
811 -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. debounce 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. 804 +- **debounce**
  805 +É muito útil em funções de pesquisa, onde você somente quer que a API seja chamada depois que o usuário terminar de digitar. Normalmente, se o usuário digitar "Jonny", será feita 5 requests na sua API, pelas letras 'J', 'o', 'n', 'n' e 'y'. Com o `debounce` isso não acontece, porque você tem a sua disposição uma função que só fazer a pesquisa na api quando o usuário parar de digitar. O `debounce` é bom para táticas anti-DDos, para funções de pesquisa em que cada letra digitada ativaria um request na API. Debounce vai esperar o usário parar de digitar o nome, para então fazer o request para API.
812 806
  807 +- **interval**
  808 +Quando se usa `debounce` , se o usuário fizer 1000 mudanças numa variável em 1 segundo, o `debounce` só computa a última mudança feita após a inatividade por um tempo estipulado (o padrão é 800 milisegundos). `interval` por outro lado vai ignorar todas as ações do usuário pelo período estipulado. Se o `interval` for de 1 segundo, então ele só conseguirá enviar 60 eventos por segundo. Se for 3 segundos de prazo, então o `interval` vai enviar 20 eventos por minuto (diferente do `debounce` que só enviaria o evento depois que o prazo estipulado acabar). Isso é recomendado para evitar abuso em funções que o usuário pode clicar rapidamente em algo para ter uma vantagem. Para exemplificar, imagine que o usuário pode ganhar moedas clicando num botão. Se ele clicar 300 vezes no botão em um minuto, ele vai ganhar 300 moedas. Usando o `interval`, você pode definir um prazo de 1 segundo por exemplo, e mesmo se ele clicasse 300 vezes em um minuto, ele ganharia apenas 60 moedas. Se fosse usado o `debounce`, o usuário ganharia apenas 1 moeda, porque só é executado quando o usuário para de clicar por um prazo estabelecido.
813 809
814 ## Navegar com rotas nomeadas 810 ## Navegar com rotas nomeadas
815 - Se você prefere navegar por rotas nomeadas, Get também dá suporte a isso: 811 - Se você prefere navegar por rotas nomeadas, Get também dá suporte a isso:
@@ -854,12 +850,12 @@ Get.toNamed("/ProximaTela", arguments: 'Get é o melhor'); @@ -854,12 +850,12 @@ Get.toNamed("/ProximaTela", arguments: 'Get é o melhor');
854 850
855 Na sua classe ou controller: 851 Na sua classe ou controller:
856 ```dart 852 ```dart
857 -print(Get.arguments); //mostra: Get é o melhor 853 +print(Get.arguments); //valor: Get é o melhor
858 ``` 854 ```
859 #### Links de Url dinâmicos 855 #### Links de Url dinâmicos
860 856
861 Get oferece links de url dinâmicos assim como na Web. 857 Get oferece links de url dinâmicos assim como na Web.
862 -Desenvolvedores Web provavelmente já queriam essa featura no Flutter, e muito provavelmente viram um package que promete essa feature e entrega uma sintaxe totalmente diferente do que uma url teria na web, mas o Get também resolve isso. 858 +Desenvolvedores Web provavelmente já queriam essa feature no Flutter, e muito provavelmente viram um package que promete essa feature mas entrega uma sintaxe totalmente diferente do que uma url teria na web, mas o Get também resolve isso.
863 ```dart 859 ```dart
864 Get.offAllNamed("/ProximaTela?device=phone&id=354&name=Enzo"); 860 Get.offAllNamed("/ProximaTela?device=phone&id=354&name=Enzo");
865 ``` 861 ```
@@ -876,7 +872,7 @@ void main() => runApp( @@ -876,7 +872,7 @@ void main() => runApp(
876 initialRoute: '/', 872 initialRoute: '/',
877 namedRoutes: { 873 namedRoutes: {
878 '/': GetRoute(page: MyHomePage()), 874 '/': GetRoute(page: MyHomePage()),
879 - /// Importante! :user não é uma nova rota, é somente uma 875 + /// Importante! ':user' não é uma nova rota, é somente uma
880 /// especificação do parâmentro. Não use '/segunda/:user/' e '/segunda' 876 /// especificação do parâmentro. Não use '/segunda/:user/' e '/segunda'
881 /// se você precisa de uma nova rota para o user, então 877 /// se você precisa de uma nova rota para o user, então
882 /// use '/segunda/user/:user' se '/segunda' for uma rota 878 /// use '/segunda/user/:user' se '/segunda' for uma rota
@@ -1025,22 +1021,19 @@ Você pode criar seu tema customizado e simplesmente adicionar ele dentro de `Ge @@ -1025,22 +1021,19 @@ Você pode criar seu tema customizado e simplesmente adicionar ele dentro de `Ge
1025 Get.changeTheme(ThemeData.light()); 1021 Get.changeTheme(ThemeData.light());
1026 ``` 1022 ```
1027 1023
1028 -Se você quer criar algo como um botão que muda o tema com um toque, você pode combinar duas APIs Get para isso, a API que checa se o tema dark está sendo usado, e a API de mudança de tema. E dentro de um `onPressed`: 1024 +Se você quer criar algo como um botão que muda o tema com um toque, você pode combinar duas APIs do Get para isso, a API que checa se o tema dark está sendo usado, e a API de mudança de tema. E dentro de um `onPressed` você coloca isso:
1029 ```dart 1025 ```dart
1030 Get.changeTheme(Get.isDarkMode? ThemeData.light(): ThemeData.dark()); 1026 Get.changeTheme(Get.isDarkMode? ThemeData.light(): ThemeData.dark());
1031 ``` 1027 ```
1032 Quando o modo escuro está ativado, ele vai alterar para o modo claro, e vice versa. 1028 Quando o modo escuro está ativado, ele vai alterar para o modo claro, e vice versa.
1033 1029
1034 -Se você quer saber a fundo como mudar o tema, você pode seguir esse tutorial no Medium que até te ensina a persistir o tema usando Get: 1030 +Se você quer saber a fundo como mudar o tema, você pode seguir esse tutorial no Medium que até te ensina a persistir o tema usando Get e shared_preferences:
1035 - [Dynamic Themes in 3 lines using Get](https://medium.com/swlh/flutter-dynamic-themes-in-3-lines-c3b375f292e3) - Tutorial by [Rod Brown](https://github.com/RodBr). 1031 - [Dynamic Themes in 3 lines using Get](https://medium.com/swlh/flutter-dynamic-themes-in-3-lines-c3b375f292e3) - Tutorial by [Rod Brown](https://github.com/RodBr).
1036 1032
1037 ### Configurações Globais Opcionais 1033 ### Configurações Globais Opcionais
1038 -Você pode criar configurações globais para o Get. Apenas adicione `Get.config` no seu código antes de ir para qualquer rota ou faça diretamente no seu GetMaterialApp  
1039 -### Optional Global Settings  
1040 -You can create Global settings for Get. Just add Get.config to your code before pushing any route or do it directly in your GetMaterialApp  
1041 - 1034 +Você pode mudar configurações globais para o Get. Apenas adicione `Get.config` no seu código antes de ir para qualquer rota ou faça diretamente no seu GetMaterialApp
1042 ```dart 1035 ```dart
1043 -//esse 1036 +// essa forma
1044 GetMaterialApp( 1037 GetMaterialApp(
1045 enableLog: true, 1038 enableLog: true,
1046 defaultTransition: Transition.fade, 1039 defaultTransition: Transition.fade,
@@ -1050,7 +1043,7 @@ GetMaterialApp( @@ -1050,7 +1043,7 @@ GetMaterialApp(
1050 defaultGlobalState: Get.defaultGlobalState, 1043 defaultGlobalState: Get.defaultGlobalState,
1051 ); 1044 );
1052 1045
1053 -// ou esse 1046 +// ou essa
1054 Get.config( 1047 Get.config(
1055 enableLog = true, 1048 enableLog = true,
1056 defaultPopGesture = true, 1049 defaultPopGesture = true,
@@ -1058,6 +1051,7 @@ Get.config( @@ -1058,6 +1051,7 @@ Get.config(
1058 ) 1051 )
1059 ``` 1052 ```
1060 ### Outras APIs avançadas e Configurações Manuais 1053 ### Outras APIs avançadas e Configurações Manuais
  1054 +
1061 GetMaterialApp configura tudo para você, mas se quiser configurar Get manualmente, você pode usando APIs avançadas. 1055 GetMaterialApp configura tudo para você, mas se quiser configurar Get manualmente, você pode usando APIs avançadas.
1062 ```dart 1056 ```dart
1063 MaterialApp( 1057 MaterialApp(
@@ -1075,51 +1069,73 @@ MaterialApp( @@ -1075,51 +1069,73 @@ MaterialApp(
1075 ``` 1069 ```
1076 1070
1077 ```dart 1071 ```dart
1078 -Get.arguments // fornece os arguments da tela atual 1072 +// fornece os arguments da tela atual
  1073 +Get.arguments
  1074 +
  1075 +// fornece os arguments da rota anterior
  1076 +Get.previousArguments
1079 1077
1080 -Get.previousArguments // fornece os arguments da rota anterior 1078 +// fornece o nome da rota anterior
  1079 +Get.previousRoute
1081 1080
1082 -Get.previousRoute // fornece o nome da rota anterior 1081 +// fornece a rota bruta para acessar por exemplo, rawRoute.isFirst()
  1082 +Get.rawRoute
1083 1083
1084 -Get.rawRoute // fornece a rota bruta para acessar por exemplo, rawRoute.isFirst() 1084 +// fornece acesso a API de rotas de dentro do GetObserver
  1085 +Get.routing
1085 1086
1086 -Get.routing // fornece acesso a API de rotas de dentro do GetObserver 1087 +// checa se o snackbar está aberto
  1088 +Get.isSnackbarOpen
1087 1089
1088 -Get.isSnackbarOpen // checa se o snackbar está aberto 1090 +// checa se o dialog está aberto
  1091 +Get.isDialogOpen
1089 1092
1090 -Get.isDialogOpen // checa se o dialog está aberto 1093 +// checa se o bottomsheet está aberto
  1094 +Get.isBottomSheetOpen
1091 1095
1092 -Get.isBottomSheetOpen // checa se o bottomsheet está aberto 1096 +// remove uma rota.
  1097 +Get.removeRoute()
1093 1098
1094 -Get.removeRoute() // remove uma rota. 1099 +// volta repetidamente até o predicate retorne true.
  1100 +Get.until()
1095 1101
1096 -Get.until() // volta repeditamente até o predicate retorne true. 1102 +// vá para a próxima rota e remove todas as rotas
  1103 +//anteriores até que o predicate retorne true.
  1104 +Get.offUntil()
1097 1105
1098 -Get.offUntil() // vá para a próxima rota e remove todas as rotas anteriores até que o predicate retorne true. 1106 +// vá para a próxima rota nomeada e remove todas as
  1107 +//rotas anteriores até que o predicate retorne true.
  1108 +Get.offNamedUntil()
1099 1109
1100 -Get.offNamedUntil() // vá para a próxima rota nomeada e remove todas as rotas anteriores até que o predicate retorne true. 1110 +// retorna qual é a plataforma
  1111 +//(Esse método é completamente compatível com o FlutterWeb,
  1112 +//diferente do método do framework "Platform.isAndroid")
  1113 +GetPlatform.isAndroid/isIOS/isWeb...
1101 1114
1102 -GetPlatform.isAndroid/isIOS/isWeb... // retorna qual é a plataforma (Esse método é completamente compatível com o FlutterWeb, diferente do método do framework "Platform.isAndroid") 1115 +// Equivalente ao método: MediaQuery.of(context).size.height
  1116 +Get.height
1103 1117
1104 -Get.height // Equivalente ao método: MediaQuery.of(context).size.height  
1105 -Get.width // Equivalente ao método: MediaQuery.of(context).size.width 1118 +// Equivalente ao método: MediaQuery.of(context).size.width
  1119 +Get.width
1106 1120
1107 -Get.context // forncece o context da tela em qualquer lugar do seu código. 1121 +// forncece o context da tela em qualquer lugar do seu código.
  1122 +Get.context
1108 1123
1109 -Get.contextOverlay // fornece o context de snackbar/dialog/bottomsheet em qualquer lugar do seu código. 1124 +// fornece o context de snackbar/dialog/bottomsheet em qualquer lugar do seu código.
  1125 +Get.contextOverlay
1110 1126
1111 ``` 1127 ```
1112 1128
1113 -### Navigators Aninhados 1129 +### Nested Navigators
1114 1130
1115 Get fez a navegação aninhada no Flutter mais fácil ainda. Você não precisa do `context`, e você encontrará sua `navigation stack` pela ID. 1131 Get fez a navegação aninhada no Flutter mais fácil ainda. Você não precisa do `context`, e você encontrará sua `navigation stack` pela ID.
1116 1132
1117 -* Nota: Criar navegação paralela em stacks pode ser perigoso. O idela é não usar `NestedNavigators`, The ideal is not to use NestedNavigators, or usar com moderação. Se o seu projeto requer isso, vá em frente, mas fique ciente que manter múltiplas stacks de navegação na memória pode não ser uma boa ideia no quesito consumo de RAM. 1133 +* Nota: Criar navegação paralela em stacks pode ser perigoso. O idela é não usar `NestedNavigators`, ou usar com moderação. Se o seu projeto requer isso, vá em frente, mas fique ciente que manter múltiplas stacks de navegação na memória pode não ser uma boa ideia no quesito consumo de RAM.
1118 1134
1119 Veja como é simples: 1135 Veja como é simples:
1120 ```dart 1136 ```dart
1121 Navigator( 1137 Navigator(
1122 - key: nestedKey(1), // crie uma key para index 1138 + key: nestedKey(1), // crie uma key com um index
1123 initialRoute: '/', 1139 initialRoute: '/',
1124 onGenerateRoute: (settings) { 1140 onGenerateRoute: (settings) {
1125 if (settings.name == '/') { 1141 if (settings.name == '/') {
@@ -1157,7 +1173,7 @@ Navigator( @@ -1157,7 +1173,7 @@ Navigator(
1157 ), 1173 ),
1158 ``` 1174 ```
1159 1175
1160 -Essa biblioteca vai sempre ficar atualizada e será sempre implementado nova features. Sinta-se livre para oferecer PRs e contribuir com o package. 1176 +Essa biblioteca sempre será atualizada e terá sempre nova features sendo implementadas. Sinta-se livre para oferecer PRs e contribuir com o package.
1161 1177
1162 1178
1163 <a href="https://www.buymeacoffee.com/jonataslaw" target="_blank"><img src="https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png" alt="Me compre um café" 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> 1179 <a href="https://www.buymeacoffee.com/jonataslaw" target="_blank"><img src="https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png" alt="Me compre um café" 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>