Nipodemos

update README-pt-br

1 -<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>  
2 ![](get.png) 1 ![](get.png)
3 2
4 -*Idiomas: [English](README.md), [Brazilian Portuguese](README.pt-br.md).* 3 +*Idiomas: [Inglês](README.md), Português Brasileiro (este aquivo)*
5 4
6 [![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)
7 ![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)
@@ -10,46 +9,57 @@ @@ -10,46 +9,57 @@
10 <img alt="Awesome Flutter" src="https://img.shields.io/badge/Awesome-Flutter-blue.svg?longCache=true&style=flat-square" /> 9 <img alt="Awesome Flutter" src="https://img.shields.io/badge/Awesome-Flutter-blue.svg?longCache=true&style=flat-square" />
11 </a> 10 </a>
12 11
  12 +<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>
13 13
14 -Get é uma biblioteca poderosa e extra-leve para Flutter que vai te dar superpoderes e aumentar sua produtividade. Navegue sem precisar do `context`, abra `Dialog`s, `Snackbar`s ou `BottomSheet`s de qualquer lugar no código, gerencie estados e injete dependências de uma forma simples e prática! Get é seguro, estável, atualizado e oferece uma enorme gama de APIs que não estão presentes no framework padrão. 14 +- Get é uma biblioteca poderosa e extra-leve para Flutter. Ela combina um gerenciador de estado de alta performance, injeção de dependência inteligente e gerenciamento de rotas de uma forma rápida e prática.
  15 +- Get não é para todos, seu foco é
  16 + - **Performance**: Já que gasta o mínimo de recursos
  17 + - **Produtividade**: Usando uma sintaxe fácil e agradável
  18 + - **Organização**: Que permite o total desacoplamento da View e da lógica de negócio.
  19 +- Get vai economizar horas de desenvolvimento, e vai extrair a performance máxima que sua aplicação pode entregar, enquanto é fácil para iniciantes e preciso para experts.
  20 +- Navegue por rotas sem `context`, abra `Dialog`s, `Snackbar`s ou `BottomSheet`s de qualquer lugar no código, gerencie estados e injete dependências de uma forma simples e prática.
  21 +- Get é seguro, estável, atualizado e oferece uma enorme gama de APIs que não estão presentes no framework padrão.
15 22
16 -```dart  
17 -// Navigator padrão do Flutter  
18 -Navigator.of(context).push(  
19 - context,  
20 - MaterialPageRoute(  
21 - builder: (BuildContext context) {  
22 - return Home();  
23 - },  
24 - ),  
25 -);  
26 -  
27 -// Sintaxe do Get  
28 -Get.to(Home());  
29 -``` 23 +**O app 'Counter' criado por padrão no com o comando `flutter create` tem mais de 100 linhas(incluindo os comentários). Para demonstrar o poder do Get, irei demonstrar como fazer o mesmo 'Counter' mudando o estado em cada toque trocando entre páginas e compartilhando o estado entre telas. Tudo de forma organizada, separando a lógica de negócio da View, COM SOMENTE 26 LINHAS INCLUINDO COMENTÁRIOS**
30 24
31 -**Exemplo completo do app Flutter counter em somente 11 linhas de código**  
32 ```dart 25 ```dart
33 void main() => runApp(GetMaterialApp(home: Home())); 26 void main() => runApp(GetMaterialApp(home: Home()));
  27 +// Crie sua classe de lógica de negócio e coloque todas as variáveis, métodos e controllers dentro dela
  28 +class Controller extends RxController {
  29 + // ".obs" transforma um objeto num Observable
  30 + var count = 0.obs;
  31 + increment() => count.value++;
  32 +}
  33 +
34 class Home extends StatelessWidget { 34 class Home extends StatelessWidget {
35 - final count = 0.obs; 35 + // Instancie sua classe usando Get.put() para torná-la disponível para todas as rotas subsequentes
  36 + final Controller c = Get.put(Controller());
36 @override 37 @override
37 Widget build(context) => Scaffold( 38 Widget build(context) => Scaffold(
38 - appBar: AppBar(title: Text("Get muda sua vida")),  
39 - floatingActionButton: FloatingActionButton(onPressed: () => count.value++),  
40 - body: Center(child: Obx(() => Text(count.string))),  
41 - ); 39 + appBar: AppBar(title: Obx(
  40 + () => Text("Total of clicks: " + c.count.string))),
  41 + // Troque o Navigator.push de 8 linhas por um simples Get.to(). Você não precisa do 'context'
  42 + body: Center(child: RaisedButton(
  43 + child: Text("Ir pra Outra tela"), onPressed: () => Get.to(Outra()))),
  44 + floatingActionButton: FloatingActionButton(child:
  45 + Icon(Icons.add), onPressed: c.increment));
42 } 46 }
  47 +
  48 +class Outra extends StatelessWidget {
  49 + // Você pode pedir o Get para encontrar o controller que foi usado em outra página e redirecionar você pra ele.
  50 + final Controller c = Get.find();
  51 + @override
  52 + Widget build(context) => Scaffold(body: Center(child: Text(c.count.string)));
  53 +}
  54 +
43 ``` 55 ```
44 56
45 -## Começando 57 +Esse é um projeto simples mas já deixa claro o quão poderoso o Get é. Enquanto seu projeto cresce, essa diferença se torna bem mais significante.
46 58
47 -A navegação convencional do Flutter tem uma grande quantidade de boilerplate (código que se repete demais), requer o `context` para navegar entre telas/rotas, abrir dialogs e usar snackbars no framework, e é entediante. 59 +Get foi feito para funcionar com times, mas torna o trabalho de um desenvolvedor individual simples.
48 60
49 -Essa biblioteca vai mudar a forma que você trabalha com o Framework e salvar seu código dos boilerplates, aumentando sua produtividade, e eliminando os bugs de reconstrução da sua aplicação. 61 +Melhore seus prazos, entregue tudo a tempo sem perder performance. Get não é para todos, mas se você identificar com o que foi dito acima, Get é para você!
50 62
51 -- [Começando](#começando)  
52 - - [Você pode contribuir no projeto de várias formas:](#você-pode-contribuir-no-projeto-de-várias-formas)  
53 - [Como usar?](#como-usar) 63 - [Como usar?](#como-usar)
54 - [Navegação sem rotas nomeadas](#navegação-sem-rotas-nomeadas) 64 - [Navegação sem rotas nomeadas](#navegação-sem-rotas-nomeadas)
55 - [SnackBars](#snackbars) 65 - [SnackBars](#snackbars)
@@ -59,7 +69,8 @@ Essa biblioteca vai mudar a forma que você trabalha com o Framework e salvar se @@ -59,7 +69,8 @@ Essa biblioteca vai mudar a forma que você trabalha com o Framework e salvar se
59 - [Uso do gerenciador de estado simples](#uso-do-gerenciador-de-estado-simples) 69 - [Uso do gerenciador de estado simples](#uso-do-gerenciador-de-estado-simples)
60 - [Sem StatefulWidget;](#sem-statefulwidget) 70 - [Sem StatefulWidget;](#sem-statefulwidget)
61 - [Formas de uso:](#formas-de-uso) 71 - [Formas de uso:](#formas-de-uso)
62 -- [Reactive State Manager - GetX](#reactive-state-manager---getx) 72 +- [Reactive State Manager](#reactive-state-manager)
  73 + - [GetX vs GetBuilder vs Obx vs MixinBuilder](#getx-vs-getbuilder-vs-obx-vs-mixinbuilder)
63 - [Gerenciamento de dependências simples](#gerenciamento-de-dependências-simples) 74 - [Gerenciamento de dependências simples](#gerenciamento-de-dependências-simples)
64 - [Bindings](#bindings) 75 - [Bindings](#bindings)
65 - [Como utilizar:](#como-utilizar) 76 - [Como utilizar:](#como-utilizar)
@@ -74,7 +85,7 @@ Essa biblioteca vai mudar a forma que você trabalha com o Framework e salvar se @@ -74,7 +85,7 @@ Essa biblioteca vai mudar a forma que você trabalha com o Framework e salvar se
74 85
75 86
76 87
77 -#### Você pode contribuir no projeto de várias formas: 88 +#### Quer contribuir no projeto? Nós ficaremos orgulhosos de ressaltar você como um dos colaboradores. Aqui vai algumas formas em que você pode contribuir e fazer Get (e Flutter) ainda melhores:
78 - Ajudando a traduzir o README para outras linguagens. 89 - Ajudando a traduzir o README para outras linguagens.
79 - Adicionando mais documentação ao README (até o momento, nem metade das funcionalidades do Get foram documentadas). 90 - Adicionando mais documentação ao README (até o momento, nem metade das funcionalidades do Get foram documentadas).
80 - Fazendo artigos/vídeos ensinando a usar o Get (eles serão inseridos no README, e no futuro na nossa Wiki). 91 - Fazendo artigos/vídeos ensinando a usar o Get (eles serão inseridos no README, e no futuro na nossa Wiki).
@@ -90,14 +101,17 @@ Qualquer contribuição é bem-vinda! @@ -90,14 +101,17 @@ Qualquer contribuição é bem-vinda!
90 (procure pela versão mais recente em pub.dev) --> 101 (procure pela versão mais recente em pub.dev) -->
91 102
92 Adicione Get ao seu arquivo pubspec.yaml 103 Adicione Get ao seu arquivo pubspec.yaml
93 -<!-- de acordo com a versão do flutter que você estiver usando --> 104 +```yaml
  105 +dependencies:
  106 + get:
  107 +```
94 108
95 Troque seu `MaterialApp()` por `GetMaterialApp()` e aproveite! 109 Troque seu `MaterialApp()` por `GetMaterialApp()` e aproveite!
96 ```dart 110 ```dart
97 import 'package:get/get.dart'; 111 import 'package:get/get.dart';
98 112
99 -GetMaterialApp( // Before: MaterialApp(  
100 - home: MyHome(), 113 +GetMaterialApp( // Antes: MaterialApp(
  114 + home: HomePage(),
101 ) 115 )
102 ``` 116 ```
103 117
@@ -108,7 +122,7 @@ Para navegar para uma próxima tela: @@ -108,7 +122,7 @@ Para navegar para uma próxima tela:
108 Get.to(ProximaTela()); 122 Get.to(ProximaTela());
109 ``` 123 ```
110 124
111 -Para retornar para a tela anterior: 125 +Para fechar snackbars, dialogs, bottomsheets, ou qualquer coisa que você normalmente fecharia com o `Navigator.pop(context)` (como por exemplo fechar a View atual e voltar para a anterior):
112 ```dart 126 ```dart
113 Get.back(); 127 Get.back();
114 ``` 128 ```
@@ -341,7 +355,7 @@ class Controller extends GetController { @@ -341,7 +355,7 @@ class Controller extends GetController {
341 int counter = 0; 355 int counter = 0;
342 void increment() { 356 void increment() {
343 counter++; 357 counter++;
344 - update(this); // use update(this) para atualizar a variável counter na UI quando increment for chamado 358 + update(); // use update() para atualizar a variável counter na UI quando increment for chamado
345 } 359 }
346 } 360 }
347 // Na sua classe Stateless/Stateful, use o GetBuilder para atualizar o texto quando a função increment for chamada 361 // Na sua classe Stateless/Stateful, use o GetBuilder para atualizar o texto quando a função increment for chamada
@@ -391,7 +405,7 @@ class Controller extends GetController { @@ -391,7 +405,7 @@ class Controller extends GetController {
391 int counter = 0; 405 int counter = 0;
392 void increment() { 406 void increment() {
393 counter++; 407 counter++;
394 - update(this); 408 + update();
395 } 409 }
396 } 410 }
397 ``` 411 ```
@@ -536,12 +550,12 @@ GetBuilder<Controller>( @@ -536,12 +550,12 @@ GetBuilder<Controller>(
536 ``` 550 ```
537 E atualizá-los dessa forma: 551 E atualizá-los dessa forma:
538 ```dart 552 ```dart
539 -update(this,['text']); 553 +update(['text']);
540 ``` 554 ```
541 555
542 Você também pode impor condições para o update acontecer: 556 Você também pode impor condições para o update acontecer:
543 ```dart 557 ```dart
544 -update(this,['text'], counter < 10); 558 +update(['text'], counter < 10);
545 ``` 559 ```
546 560
547 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). 561 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).
@@ -550,10 +564,10 @@ GetBuilder é focado precisamente em múltiplos controles de estados. Imagine qu @@ -550,10 +564,10 @@ GetBuilder é focado precisamente em múltiplos controles de estados. Imagine qu
550 564
551 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. 565 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 566
553 -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. 567 +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()`. 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 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. 568 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 569
556 -## Reactive State Manager - GetX 570 +## Reactive State Manager
557 571
558 Se você quer poder, Get té dá o mais avançado gerenciador de estado que você pode ter. 572 Se você quer poder, Get té dá o mais avançado gerenciador de estado que você pode ter.
559 GetX foi construído 100% baseado em Stream, e te dá todo o poder de fogo que o BLoc te dá, com uma sintaxe mais fácil que a do MobX. 573 GetX foi construído 100% baseado em Stream, e te dá todo o poder de fogo que o BLoc te dá, com uma sintaxe mais fácil que a do MobX.
@@ -686,8 +700,35 @@ Obviamente, se alguém quiser contribuir para o projeto e criar um code generato @@ -686,8 +700,35 @@ Obviamente, se alguém quiser contribuir para o projeto e criar um code generato
686 700
687 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. 701 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 702
689 -## Gerenciamento de dependências simples 703 +### GetX vs GetBuilder vs Obx vs MixinBuilder
  704 +
  705 +Em uma década de trabalho com programação eu fui capaz de aprender umas lições valiosas.
  706 +
  707 +Meu primeiro contato com programação reactiva foi tão "Nossa, isso é incrível" e de fato é incrível.
  708 +
  709 +Porém, não é ideal para todas as situações. De vez em quando tudo que você precisa é mudar o estado de duas ou três variáveis ao mesmo tempo, ou uma mudança de estado diferente, que nesses casos a programação reativa não é ruim, mas não é apropriado.
  710 +
  711 +Programação reativa tem um consumo de RAM maior que pode ser compensado pelo fluxo individual, que vai se encarregar que apenas o Widget necessário é reconstruído, mas criar uma lista com 80 objetos, cada um com vários streams não é uma boa ideia. Abra o `dart inspect` e cheque quando um StreamBuilder consome, e você vai entender o que eu estou tentando dizer a você.
  712 +
  713 +Com isso em mente, eu criar o gerenciador de estados simples. É simples, e é exatamente o que você deve exigir dele: alterar vários estados em blocos de uma forma simples, e mais econômico possível.
690 714
  715 +GetBuilder economiza muito quando se trata de RAM, e dificilmente vai existir uma forma mais econômica de lidar com isso do que ele (pelo menos eu não consigo imaginar nenhum. Se existir, me avise).
  716 +
  717 +Entretando, GetBuilder ainda é um gerenciador de estados "mecânico", você precisa chamar o `update()` assim como você faria com o `notifyListeners()` do `Provider`.
  718 +
  719 +Há outras situações onde a programação reativa é muito interessante, e não trabalhar com ela é a mesma coisa que reinventar a roda. Com isso em mente, GetX foi criado para prover tudo que há de mais moder e avançado num gerenciado de estado. Ele atualiza somente o que é necessário quando for necessário. Se por exemplo você tiver um erro que mande 300 alterações de estado simultaneamente, GetX vai filtrar e alterar a tela somente se o estado mudar de verdade.
  720 +
  721 +GetX ainda é mais econômico que qualquer outro gerenciador de estados reativo, mas consome um pouco mais de RAM do que o GetBuilder. Pensando nisso e mirando em minimizar o consumo de recursos que o Obx foi criado.
  722 +
  723 +Ao contrário de GetX e GetBuilder, você não será capaz de inicializar o controller dentro do Obx, é só um Widget com um `StreamSubscription` que recebe eventos de mundança das childrens ou child, só isso. É mais econômico que o GetX, mas perde para o GetBuilder, que é nada mais que o esperado, já que é reativo. GetBuilder tem uma das formas mais simplística que existe, de guardar o hashcode de um Widget e seu StateSetter. Com Obs você não precisa escrever seu tipo de controller, e você pode ouvir mudanças de múltiplos controllers diferentes, mas eles precisam ser inicializados antes, tanto usando o forma demonstrada no exemplo no início desse README, ou usando a classe `Bindings`
  724 +
  725 +Concluindo, uma pessoa abriu um pedido para uma feature nova, como ele queria usar somente um tipo de variável reativa, e precisava inserir um Obx junto do GetBuilder para isso. Pensando nisso, `MixinBuilder` foi criado. Ele permite as duas formas de alterar estados: usando variáveis com `.obs`, ou a forma mecânica via `update()`
  726 +
  727 +Porém, desses 4 widgets, esse é o que consome mais recursos, já que usa os dois gerenciadores de estado combinados.
  728 +
  729 +- Nota: Para usar GetBuilder e MixinBuilder você precisa usar GetController. Para usar GetX ou Obx você precisa usar RxController.
  730 +
  731 +## Gerenciamento de dependências simples
691 * 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ê. 732 * 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 733
693 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: 734 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: