Committed by
GitHub
Merge pull request #617 from eduardoflorence/doc-ptbr-readme
Readme pt-br: atualização da documentação
Showing
1 changed file
with
327 additions
and
77 deletions
@@ -16,9 +16,8 @@ | @@ -16,9 +16,8 @@ | ||
16 | 16 | ||
17 |  | 17 |  |
18 | 18 | ||
19 | -<h2> Pedimos desculpas por qualquer parte não traduzida aqui. O GetX é atualizado com muita frequência e as traduções podem não vir ao mesmo tempo. Então, para manter essa documentação pelo menos com tudo que a versão em inglês tem, eu vou deixar todos os textos não-traduzidos aqui (eu considero que é melhor ele estar lá em inglês do que não estar), então se alguém quiser traduzir, seria muito útil 😁</h2> | 19 | +<h2> Pedimos desculpas por qualquer parte não traduzida aqui. O GetX™ é atualizado com muita frequência e as traduções podem não vir ao mesmo tempo. Então, para manter essa documentação pelo menos com tudo que a versão em inglês tem, eu vou deixar todos os textos não-traduzidos aqui (eu considero que é melhor ele estar lá em inglês do que não estar), então se alguém quiser traduzir, seria muito útil 😁</h2> |
20 | 20 | ||
21 | -- [Canais para comunicação e suporte:](#canais-para-comunicação-e-suporte) | ||
22 | - [Sobre Get](#sobre-get) | 21 | - [Sobre Get](#sobre-get) |
23 | - [Instalando](#instalando) | 22 | - [Instalando](#instalando) |
24 | - [App Counter usando GetX](#app-counter-usando-getx) | 23 | - [App Counter usando GetX](#app-counter-usando-getx) |
@@ -32,41 +31,49 @@ | @@ -32,41 +31,49 @@ | ||
32 | - [Explicação em video do gerenciamento de rotas](#explicação-em-video-do-gerenciamento-de-rotas) | 31 | - [Explicação em video do gerenciamento de rotas](#explicação-em-video-do-gerenciamento-de-rotas) |
33 | - [Gerenciamento de Dependência](#gerenciamento-de-dependência) | 32 | - [Gerenciamento de Dependência](#gerenciamento-de-dependência) |
34 | - [Mais detalhes sobre gerenciamento de dependências](#mais-detalhes-sobre-gerenciamento-de-dependências) | 33 | - [Mais detalhes sobre gerenciamento de dependências](#mais-detalhes-sobre-gerenciamento-de-dependências) |
35 | -- [Como contribuir](#como-contribuir) | ||
36 | - [Utilidades](#utilidades) | 34 | - [Utilidades](#utilidades) |
37 | - [Internacionalização](#internacionalização) | 35 | - [Internacionalização](#internacionalização) |
36 | + - [Traduções](#traduções) | ||
37 | + - [Usando traduções](#usando-traduções) | ||
38 | + - [Localidade](#localidade) | ||
39 | + - [Alterar Local](#alterar-local) | ||
40 | + - [Localidade do sistema operacional](#localidade-do-sistema-operacional) | ||
38 | - [Mudar tema (changeTheme)](#mudar-tema-changetheme) | 41 | - [Mudar tema (changeTheme)](#mudar-tema-changetheme) |
39 | - [Outras APIs avançadas](#outras-apis-avançadas) | 42 | - [Outras APIs avançadas](#outras-apis-avançadas) |
40 | - [Configurações Globais opcionais e configurações manuais](#configurações-globais-opcionais-e-configurações-manuais) | 43 | - [Configurações Globais opcionais e configurações manuais](#configurações-globais-opcionais-e-configurações-manuais) |
41 | - - [Video explanation of Other GetX Features](#explicação-em-vídeo-sobre-outras-features-do-getx) | 44 | + - [Widgets de Estado Local](#widgets-de-estado-local) |
45 | + - [ValueBuilder](#valuebuilder) | ||
46 | + - [ObxValue](#obxvalue) | ||
47 | + - [Dicas Úteis](#dicas-úteis) | ||
48 | + - [GetView](#getview) | ||
49 | + - [GetWidget](#getwidget) | ||
50 | + - [GetxService](#getxservice) | ||
51 | + - [Explicação em vídeo sobre Outras Features do GetX](#explicação-em-vídeo-sobre-outras-features-do-getx) | ||
42 | - [Breaking Changes da versão 2 para 3](#breaking-changes-da-versão-2-para-3) | 52 | - [Breaking Changes da versão 2 para 3](#breaking-changes-da-versão-2-para-3) |
43 | - [Tipagem Rx](#tipagem-rx) | 53 | - [Tipagem Rx](#tipagem-rx) |
44 | - [RxController e GetBuilder se uniram](#rxcontroller-e-getbuilder-se-uniram) | 54 | - [RxController e GetBuilder se uniram](#rxcontroller-e-getbuilder-se-uniram) |
45 | - [Rotas nomeadas](#rotas-nomeadas) | 55 | - [Rotas nomeadas](#rotas-nomeadas) |
46 | - [Porque essa mudança](#porque-essa-mudança) | 56 | - [Porque essa mudança](#porque-essa-mudança) |
47 | - [Por que GetX?](#por-que-getx) | 57 | - [Por que GetX?](#por-que-getx) |
48 | - | ||
49 | -# Canais para comunicação e suporte: | ||
50 | - | ||
51 | -[**Slack (Inglês)**](https://communityinviter.com/apps/getxworkspace/getx) | ||
52 | - | ||
53 | -[**Discord (Inglês e Português)**](https://discord.com/invite/9Hpt99N) | ||
54 | - | ||
55 | -[**Telegram (Português)**](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) | 58 | +- [Comunidade](#comunidade) |
59 | + - [Canais da comunidade](#canais-da-comunidade) | ||
60 | + - [Como contribuir](#como-contribuir) | ||
61 | + - [Artigos e vídeos](#artigos-e-vídeos) | ||
56 | 62 | ||
57 | # Sobre Get | 63 | # Sobre Get |
58 | 64 | ||
59 | - Get é uma biblioteca poderosa e extraleve 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. | 65 | - Get é uma biblioteca poderosa e extraleve 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. |
60 | -- Get não é para todos, seu foco é: | ||
61 | - - **Performance**: Já que gasta o mínimo de recursos | ||
62 | - - **Produtividade**: Usando uma sintaxe fácil e agradável | ||
63 | - - **Organização**: Que permite o total desacoplamento da View e da lógica de negócio. | ||
64 | -- 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. | 66 | +- GetX™ possui 3 princípios básicos, o que significa que esta é a prioridade para todos os recursos da biblioteca |
67 | + - **PERFOMANCE**: GetX™ é focado em desempenho e consumo mínimo de recursos. Os benchmarks quase sempre não são importantes no mundo real, mas se você quiser, há um indicador de consumo aqui ([benchmarks](https://github.com/jonataslaw/benchmarks)), onde GetX™ se sai melhor do que outras abordagens de gerenciamento de estado, por exemplo. A diferença não é grande, mas mostra nossa preocupação em não desperdiçar seus recursos. | ||
68 | + - **PRODUTIVIDADE**: GetX™ usa uma sintaxe fácil e agradável. Não importa o que você queira fazer, sempre há uma maneira mais fácil com GetX™. Isso economizará horas de desenvolvimento e extrairá o máximo de desempenho que seu aplicativo pode oferecer. | ||
69 | + - **ORGANIZAÇÃO**: GetX™ permite o desacoplamento total da View, lógica de apresentação, lógica de negócios, injeção de dependência e navegação. Você não precisa de contexto para navegar entre as rotas, portanto, você não depende da árvore do widget (visualização) para isso. Você não precisa de contexto para acessar seus Controllers / BLoCs por meio de um inheritedWidget, então você desacopla completamente sua lógica de apresentação e lógica de negócios de sua camada de visualização. Você não precisa injetar suas classes Controllers / Models / BLoCs em sua árvore de widgets através de multiproviders, pois GetX™ usa seu próprio recurso de injeção de dependência, desacoplando a DI de sua View completamente. Com GetX™ você sabe onde encontrar cada recurso de sua aplicação, tendo o código limpo por padrão. Isso além de facilitar a manutenção, torna o compartilhamento dos módulos, algo que até então em Flutter era impensável, algo totalmente possível. O BLoC foi um ponto de partida para organizar o código no Flutter, ele separa a lógica de negócios da visualização. GetX™ é uma evolução natural disso, separando não apenas a lógica de negócios, mas a lógica de apresentação. O bônus da injeção de dependências e rotas também são dissociadas e a camada de dados está fora de tudo. Você sabe onde está tudo e tudo isso de uma maneira mais fácil do que construir um hello world. GetX™ é a maneira mais fácil, prática e escalonável de construir aplicativos de alto desempenho com o Flutter SDK, com um grande ecossistema em torno dele que funciona perfeitamente em conjunto, sendo fácil para iniciantes e preciso para especialistas. É seguro, estável, atualizado e oferece uma grande variedade de APIs integradas que não estão presentes no Flutter SDK padrão. | ||
70 | +- GetX™ não é inchado. Possui uma infinidade de recursos que permitem que você comece a programar sem se preocupar com nada, mas cada um desses recursos está em contêineres separados e só são iniciados após o uso. Se você usar apenas o Gerenciamento de estado, apenas o Gerenciamento de estado será compilado. Se você usar apenas rotas, nada do gerenciamento de estado será compilado. Você pode compilar o repositório de benchmark e verá que usando apenas o gerenciamento de estado Get, o aplicativo compilado com Get tornou-se menor do que todos os outros aplicativos que têm apenas o gerenciamento de estado de outros pacotes, porque nada que não seja usado será compilado em seu código e cada solução GetX™ foi projetada para ser extra leve. O mérito aqui também vem do tree shaking do Flutter, que é incrível e consegue eliminar recursos não utilizados como nenhum outro framework faz. | ||
65 | - 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. | 71 | - 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. |
66 | -- Get é seguro, estável, atualizado e oferece uma enorme gama de APIs que não estão presentes no framework padrão. | ||
67 | -- GetX é desacoplado. Ele tem uma variedade de recursos que te permite começar a programar sem se preocupar com nada, mas cada um desses recursos estão em um container separado, ou seja, nenhuma depende da outra para funcionar. Elas só são inicializadas após o uso. Se você usa apenas o gerenciador de estado, apenas ele será compilado. Teste você mesmo, vá no repositório de benchmark do getX e perceberá: usando somente o gerenciador de estado do Get, a aplicação ficou mais leve do que outros projetos que também estão usando só o gerenciador de estado, porque nada que não seja usado será compilado no seu código e cada recuro do GetX foi feito para ser muito leve. O mérito vem também do AOT do próprio Flutter que é incrível e consegue eliminar recursos não utilizados de uma forma que nenhum outro framework consegue. | 72 | +- GetX™ possui um enorme ecossistema, capaz de rodar com o mesmo código no Android, iOS, Web, Mac, Linux, Windows e em seu servidor. É possível reutilizar totalmente o código feito no front-end em seu back-end com **[Get Server](https://github.com/jonataslaw/get_server)**. |
68 | 73 | ||
69 | -**GetX faz seu desenvolvimento mais produtivo, mas quer deixá-lo mais produtivo ainda? Adicione a extensão [GetX extension](https://marketplace.visualstudio.com/items?itemName=get-snippets.get-snippets) no seu VSCode**. Não disponível para outras IDEs por enquanto. | 74 | +Além disso, todo o processo de desenvolvimento pode ser totalmente automatizado, tanto no servidor quanto no front-end com **[Get CLI](https://github.com/jonataslaw/get_cli)**. |
75 | + | ||
76 | +Além disso, para aumentar ainda mais sua produtividade, temos a **[extensão para VSCode](https://marketplace.visualstudio.com/items?itemName=get-snippets.get-snippets)** e a **[extensão para Android Studio/Intellij](https://plugins.jetbrains.com/plugin/14975-getx-snippets)** | ||
70 | 77 | ||
71 | # Instalando | 78 | # Instalando |
72 | 79 | ||
@@ -121,8 +128,7 @@ class Home extends StatelessWidget { | @@ -121,8 +128,7 @@ class Home extends StatelessWidget { | ||
121 | final Controller c = Get.put(Controller()); | 128 | final Controller c = Get.put(Controller()); |
122 | @override | 129 | @override |
123 | Widget build(context) => Scaffold( | 130 | Widget build(context) => Scaffold( |
124 | - appBar: AppBar(title: Obx( | ||
125 | - () => Text("Total of clicks: " + c.count.string))), | 131 | + appBar: AppBar(title: Obx(() => Text("Total de cliques: ${c.count}"))), |
126 | // Troque o Navigator.push de 8 linhas por um simples Get.to(). Você não precisa do 'context' | 132 | // Troque o Navigator.push de 8 linhas por um simples Get.to(). Você não precisa do 'context' |
127 | body: Center(child: RaisedButton( | 133 | body: Center(child: RaisedButton( |
128 | child: Text("Ir pra Outra tela"), onPressed: () => Get.to(Outra()))), | 134 | child: Text("Ir pra Outra tela"), onPressed: () => Get.to(Outra()))), |
@@ -134,7 +140,7 @@ class Outra extends StatelessWidget { | @@ -134,7 +140,7 @@ class Outra extends StatelessWidget { | ||
134 | // Você pode pedir o Get para encontrar o controller que foi usado em outra página e redirecionar você pra ele. | 140 | // Você pode pedir o Get para encontrar o controller que foi usado em outra página e redirecionar você pra ele. |
135 | final Controller c = Get.find(); | 141 | final Controller c = Get.find(); |
136 | @override | 142 | @override |
137 | - Widget build(context) => Scaffold(body: Center(child: Text(c.count.string))); | 143 | + Widget build(context) => Scaffold(body: Center(child: Text("${c.count}"))); |
138 | } | 144 | } |
139 | 145 | ||
140 | ``` | 146 | ``` |
@@ -160,9 +166,11 @@ Get não é melhor ou pior que nenhum gerenciador de estado, mas você deveria a | @@ -160,9 +166,11 @@ Get não é melhor ou pior que nenhum gerenciador de estado, mas você deveria a | ||
160 | 166 | ||
161 | Definitivamente, Get não é o inimigo de nenhum gerenciador, porque Get é um microframework, não apenas um gerenciador, e pode ser usado tanto sozinho quanto em conjunto com eles. | 167 | Definitivamente, Get não é o inimigo de nenhum gerenciador, porque Get é um microframework, não apenas um gerenciador, e pode ser usado tanto sozinho quanto em conjunto com eles. |
162 | 168 | ||
169 | +Get tem dois gerenciadores de estado diferentes: o simple state manager (vamos chamá-lo de GetBuilder) e o reactive state manager (que tem o nome do pacote, GetX) | ||
170 | + | ||
163 | ### Reactive state manager | 171 | ### Reactive state manager |
164 | 172 | ||
165 | -Programação reativa pode alienar muitas pessoas porque é dito que é complicado. GetX transforma a programação reativa em algo bem simples: | 173 | +Programação reativa pode alienar muitas pessoas porque é dito que é complicado. GetX™ transforma a programação reativa em algo bem simples: |
166 | 174 | ||
167 | * Você não precisa criar StreamControllers | 175 | * Você não precisa criar StreamControllers |
168 | * Você não precisa criar um StreamBuilder para cada variável | 176 | * Você não precisa criar um StreamBuilder para cada variável |
@@ -187,7 +195,6 @@ var name = 'Jonatas Borges'.obs; | @@ -187,7 +195,6 @@ var name = 'Jonatas Borges'.obs; | ||
187 | 195 | ||
188 | E Na UI, quando quiser mostrar a variável e escutar as mudanças dela, simplesmente faça isso: | 196 | E Na UI, quando quiser mostrar a variável e escutar as mudanças dela, simplesmente faça isso: |
189 | 197 | ||
190 | - | ||
191 | ```dart | 198 | ```dart |
192 | Obx (() => Text (controller.name)); | 199 | Obx (() => Text (controller.name)); |
193 | ``` | 200 | ``` |
@@ -202,10 +209,20 @@ Só isso. É *simples assim*; | @@ -202,10 +209,20 @@ Só isso. É *simples assim*; | ||
202 | 209 | ||
203 | Amateur Coder fez um vídeo ótimo sobre o gerenciamento de estado! (em inglês). Link: [Complete GetX State Management](https://www.youtube.com/watch?v=CNpXbeI_slw) | 210 | Amateur Coder fez um vídeo ótimo sobre o gerenciamento de estado! (em inglês). Link: [Complete GetX State Management](https://www.youtube.com/watch?v=CNpXbeI_slw) |
204 | 211 | ||
205 | -Você vai ter uma boa idea do poder do GetX | 212 | +Você vai ter uma boa idea do poder do GetX™ |
206 | 213 | ||
207 | ## Gerenciamento de rotas | 214 | ## Gerenciamento de rotas |
208 | 215 | ||
216 | +Se você for usar routes / snackbars / dialogs / bottomsheets sem contexto, GetX™ é excelente para você também, veja: | ||
217 | + | ||
218 | +Adicione "Get" antes do seu MaterialApp, transformando-o em GetMaterialApp | ||
219 | + | ||
220 | +```dart | ||
221 | +GetMaterialApp( // Antes: MaterialApp( | ||
222 | + home: MyHome(), | ||
223 | +) | ||
224 | +``` | ||
225 | + | ||
209 | Para navegar para uma próxima tela: | 226 | Para navegar para uma próxima tela: |
210 | 227 | ||
211 | ```dart | 228 | ```dart |
@@ -236,11 +253,11 @@ Para navegar para a próxima rota e receber ou atualizar dados assim que retorna | @@ -236,11 +253,11 @@ Para navegar para a próxima rota e receber ou atualizar dados assim que retorna | ||
236 | var dados = await Get.to(Pagamento()); | 253 | var dados = await Get.to(Pagamento()); |
237 | ``` | 254 | ``` |
238 | 255 | ||
239 | -Notou que você não precisou usar `context` para fazer nenhuma dessas coisas? Essa é uma das maiores vantagens de usar o gerenciamento de rotas do GetX. Com isso, você pode executar todos esse métodos de dentro da classe Controller, sem preocupações. | 256 | +Notou que você não precisou usar `context` para fazer nenhuma dessas coisas? Essa é uma das maiores vantagens de usar o gerenciamento de rotas do GetX™. Com isso, você pode executar todos esse métodos de dentro da classe Controller, sem preocupações. |
240 | 257 | ||
241 | ### Mais detalhes sobre gerenciamento de rotas | 258 | ### Mais detalhes sobre gerenciamento de rotas |
242 | 259 | ||
243 | -**GetX funciona com rotas nomeadas também! Veja uma explicação mais completa do gerenciamento de rotas [aqui](./documentation/pt_BR/route_management.md)** | 260 | +**GetX™ funciona com rotas nomeadas também! Veja uma explicação mais completa do gerenciamento de rotas [aqui](./documentation/pt_BR/route_management.md)** |
244 | 261 | ||
245 | ### Explicação em video do gerenciamento de rotas | 262 | ### Explicação em video do gerenciamento de rotas |
246 | 263 | ||
@@ -256,9 +273,10 @@ Já está usando o Get e quer fazer seu projeto o melhor possível? Get tem um g | @@ -256,9 +273,10 @@ Já está usando o Get e quer fazer seu projeto o melhor possível? Get tem um g | ||
256 | Controller controller = Get.put(Controller()); // Em vez de Controller controller = Controller(); | 273 | Controller controller = Get.put(Controller()); // Em vez de Controller controller = Controller(); |
257 | ``` | 274 | ``` |
258 | 275 | ||
259 | -Em vez de instanciar sua classe dentro da classe que você está usando, você está instanciando ele dentro da instância do Get, que vai fazer ele ficar disponível por todo o App | 276 | +Em vez de instanciar sua classe dentro da classe que você está usando, você está instanciando ele dentro da instância do Get, que vai fazer ele ficar disponível por todo o App para que então você possa usar seu controller (ou uma classe Bloc) normalmente |
277 | + | ||
260 | 278 | ||
261 | -Para que então você possa usar seu controller (ou uma classe Bloc) normalmente | 279 | +**Dica:** O gerenciamento de dependência Get é desacoplado de outras partes do pacote, então se, por exemplo, seu aplicativo já estiver usando um gerenciador de estado (qualquer um, não importa), você não precisa reescrever tudo, você pode usar esta injeção de dependência sem problemas |
262 | 280 | ||
263 | ```dart | 281 | ```dart |
264 | controller.fetchApi(); | 282 | controller.fetchApi(); |
@@ -290,42 +308,31 @@ Get.lazyPut<Service>(()=> ApiMock()); | @@ -290,42 +308,31 @@ Get.lazyPut<Service>(()=> ApiMock()); | ||
290 | 308 | ||
291 | **Veja uma explicação mais completa do gerenciamento de dependência [aqui](./documentation/pt_BR/dependency_management.md)** | 309 | **Veja uma explicação mais completa do gerenciamento de dependência [aqui](./documentation/pt_BR/dependency_management.md)** |
292 | 310 | ||
293 | -# Como contribuir | ||
294 | - | ||
295 | -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 | ||
296 | - | ||
297 | -- Ajudando a traduzir o README para outras linguagens. | ||
298 | -- Adicionando mais documentação ao README (até o momento, várias das funcionalidades do Get não foram documentadas). | ||
299 | -- Fazendo artigos/vídeos ensinando a usar o Get (eles serão inseridos no README e no futuro na nossa Wiki). | ||
300 | -- Fazendo PR's (Pull-Requests) para código/testes. | ||
301 | -- Incluindo novas funcionalidades. | ||
302 | - | ||
303 | -Qualquer contribuição é bem-vinda! | ||
304 | - | ||
305 | # Utilidades | 311 | # Utilidades |
306 | 312 | ||
307 | ## Internacionalização | 313 | ## Internacionalização |
308 | ### Traduções | 314 | ### Traduções |
309 | -As traduções são mantidas num simples dictionary map de chave-valor. | 315 | +Nós mantemos as traduções num simples dictionary map de chave-valor. |
310 | Para adicionar traduções personalizadas, crie uma classe e estenda `Translations`. | 316 | Para adicionar traduções personalizadas, crie uma classe e estenda `Translations`. |
317 | + | ||
311 | ```dart | 318 | ```dart |
312 | import 'package:get/get.dart'; | 319 | import 'package:get/get.dart'; |
313 | 320 | ||
314 | class Messages extends Translations { | 321 | class Messages extends Translations { |
315 | @override | 322 | @override |
316 | Map<String, Map<String, String>> get keys => { | 323 | Map<String, Map<String, String>> get keys => { |
317 | - 'en_US': { | ||
318 | - 'hello': 'Hello World', | ||
319 | - }, | ||
320 | - 'de_DE': { | ||
321 | - 'hello': 'Hallo Welt', | ||
322 | - } | ||
323 | - }; | 324 | + 'en_US': { |
325 | + 'hello': 'Hello World', | ||
326 | + }, | ||
327 | + 'de_DE': { | ||
328 | + 'hello': 'Hallo Welt', | ||
329 | + } | ||
330 | + }; | ||
324 | } | 331 | } |
325 | ``` | 332 | ``` |
326 | 333 | ||
327 | #### Usando traduções | 334 | #### Usando traduções |
328 | -Basta anexar `.tr` a chave especificada e ela será traduzida, usando o valor atual de `Get.locale` e `Get.fallbackLocale`. | 335 | +Basta anexar `.tr` a chave especificada e ela será traduzida, usando o valor atual de `Get.locale` ou `Get.fallbackLocale`. |
329 | ```dart | 336 | ```dart |
330 | Text('hello'.tr); | 337 | Text('hello'.tr); |
331 | ``` | 338 | ``` |
@@ -343,7 +350,7 @@ return GetMaterialApp( | @@ -343,7 +350,7 @@ return GetMaterialApp( | ||
343 | ``` | 350 | ``` |
344 | 351 | ||
345 | #### Alterar local | 352 | #### Alterar local |
346 | -Use `Get.updateLocale(locale)` para atualizar a localidade. As traduções usarão automaticamente a nova localidade. | 353 | +Use `Get.updateLocale(locale)` para atualizar a localidade. As traduções usarão automaticamente a nova localidade e a UI será atualizada. |
347 | ```dart | 354 | ```dart |
348 | var locale = Locale('en', 'US'); | 355 | var locale = Locale('en', 'US'); |
349 | Get.updateLocale(locale); | 356 | Get.updateLocale(locale); |
@@ -361,7 +368,7 @@ return GetMaterialApp( | @@ -361,7 +368,7 @@ return GetMaterialApp( | ||
361 | 368 | ||
362 | ## Mudar tema (changeTheme) | 369 | ## Mudar tema (changeTheme) |
363 | 370 | ||
364 | -Por favor não use widget acima do GetMaterialApp para atualizar o tema. Isso pode causar keys duplicadas. Várias pessoas estão acostumadas com o jeito normal de criar um Widget `ThemeProvider` só pra alterar o tema do app, mas isso definitivamente NÃO é necessário no Get. | 371 | +Por favor não use widget acima do GetMaterialApp para atualizar o tema. Isso pode causar keys duplicadas. Várias pessoas estão acostumadas com o jeito normal de criar um Widget `ThemeProvider` só pra alterar o tema do app, mas isso definitivamente NÃO é necessário com GetX™. |
365 | 372 | ||
366 | Você pode criar seu tema customizado e simplesmente adicionar dentro do `Get.changeTheme` sem nenhum boilerplate para isso: | 373 | Você pode criar seu tema customizado e simplesmente adicionar dentro do `Get.changeTheme` sem nenhum boilerplate para isso: |
367 | 374 | ||
@@ -369,14 +376,12 @@ Você pode criar seu tema customizado e simplesmente adicionar dentro do `Get.ch | @@ -369,14 +376,12 @@ Você pode criar seu tema customizado e simplesmente adicionar dentro do `Get.ch | ||
369 | Get.changeTheme(ThemeData.light()) | 376 | Get.changeTheme(ThemeData.light()) |
370 | ``` | 377 | ``` |
371 | 378 | ||
372 | -Se você quer criar algo como um botão que muda o tema com o toque, você pode combinar duas APIs Get pra isso: a API que checa se o tema dark está sendo aplicado, e a API de mudar o tema, e colocar isso no `onPressed:` | 379 | +Se você quer criar algo como um botão que muda o tema com o toque, você pode combinar duas APIs GetX™ pra isso: |
380 | +- A API que checa se o tema dark está sendo aplicado; | ||
381 | +- A API de mudar o tema e colocar isso no `onPressed:` | ||
373 | 382 | ||
374 | ```dart | 383 | ```dart |
375 | -Get.changeTheme( | ||
376 | - Get.isDarkMode | ||
377 | - ? ThemeData.light() | ||
378 | - : ThemeData.dark() | ||
379 | -) | 384 | +Get.changeTheme(Get.isDarkMode ? ThemeData.light() : ThemeData.dark()) |
380 | ``` | 385 | ``` |
381 | 386 | ||
382 | Quando o modo Dark está ativado, ele vai trocar pro modo light e vice versa. | 387 | Quando o modo Dark está ativado, ele vai trocar pro modo light e vice versa. |
@@ -426,14 +431,26 @@ Get.offUntil() | @@ -426,14 +431,26 @@ Get.offUntil() | ||
426 | //rotas anteriores até que o predicate retorne true. | 431 | //rotas anteriores até que o predicate retorne true. |
427 | Get.offNamedUntil() | 432 | Get.offNamedUntil() |
428 | 433 | ||
429 | -// retorna qual é a plataforma | ||
430 | -//(Esse método é completamente compatível com o FlutterWeb, | ||
431 | -//diferente do método do framework "Platform.isAndroid") | 434 | +// Verifica em que plataforma o app está sendo executado |
435 | +// (Esse método é completamente compatível com o FlutterWeb, | ||
436 | +// diferente do método do framework "Platform.isAndroid") | ||
432 | GetPlatform.isAndroid | 437 | GetPlatform.isAndroid |
433 | GetPlatform.isIOS | 438 | GetPlatform.isIOS |
439 | +GetPlatform.isMacOS | ||
440 | +GetPlatform.isWindows | ||
441 | +GetPlatform.isLinux | ||
442 | +GetPlatform.isFuchsia | ||
443 | + | ||
444 | +// Verifica o tipo de dispositivo | ||
445 | +GetPlatform.isMobile | ||
446 | +GetPlatform.isDesktop | ||
447 | +// Todas as plataformas são suportadas de forma independente na web! | ||
448 | +// Você pode saber se está executando dentro de um navegador | ||
449 | +// no Windows, iOS, OSX, Android, etc. | ||
434 | GetPlatform.isWeb | 450 | GetPlatform.isWeb |
435 | 451 | ||
436 | -// Equivalente ao método: MediaQuery.of(context).size.width ou height, mas é imutável. Significa que não irá atualizar mesmo que o tamanho da tela mude (como em navegadores ou app desktop) | 452 | +// Equivalente ao método: MediaQuery.of(context).size.width ou height, mas é imutável. |
453 | +// Significa que não irá atualizar mesmo que o tamanho da tela mude (como em navegadores ou app desktop) | ||
437 | Get.height | 454 | Get.height |
438 | Get.width | 455 | Get.width |
439 | 456 | ||
@@ -446,7 +463,8 @@ Get.contextOverlay | @@ -446,7 +463,8 @@ Get.contextOverlay | ||
446 | // Obs: os métodos a seguir são extensions do context. Já que se | 463 | // Obs: os métodos a seguir são extensions do context. Já que se |
447 | // tem acesso ao context em qualquer lugar do código da UI, você pode usar lá | 464 | // tem acesso ao context em qualquer lugar do código da UI, você pode usar lá |
448 | 465 | ||
449 | -// Se você precisa de um width/height adaptável (como em navegadores em que a janela pode ser redimensionada) você precisa usar 'context' | 466 | +// Se você precisa de um width/height adaptável (como em navegadores em que a janela pode ser redimensionada) |
467 | +// você precisa usar 'context' | ||
450 | context.width | 468 | context.width |
451 | context.height | 469 | context.height |
452 | 470 | ||
@@ -551,7 +569,7 @@ Get.config( | @@ -551,7 +569,7 @@ Get.config( | ||
551 | ) | 569 | ) |
552 | ``` | 570 | ``` |
553 | 571 | ||
554 | -É possível redirecionar todas as mensagens de log do GetX. Útil quando se tem um package de logging e vc quer que ele lide com todos os logs | 572 | +É possível redirecionar todas as mensagens de log do GetX™. Útil quando se tem um package de logging e vc quer que ele lide com todos os logs |
555 | 573 | ||
556 | ```dart | 574 | ```dart |
557 | GetMaterialApp( | 575 | GetMaterialApp( |
@@ -569,10 +587,10 @@ void localLogWriter(String text, {bool isError = false}) { | @@ -569,10 +587,10 @@ void localLogWriter(String text, {bool isError = false}) { | ||
569 | 587 | ||
570 | ### Widgets de Estado Local | 588 | ### Widgets de Estado Local |
571 | 589 | ||
572 | -Esses Widgets permitem que você gerencie um único valor e mantenha o estado efêmero e localmente. Temos versões para Reativo e Simples. Por exemplo, você pode usá-los para alternar obscureText em um TextField, talvez criar um painel expansível personalizado ou talvez modificar o índice atual em um BottomNavigationBar enquanto altera o conteúdo do corpo em um Scaffold. | 590 | +Esses Widgets permitem que você gerencie um único valor e mantenha o estado efêmero e localmente. Temos versões para Reativo e Simples. Por exemplo, você pode usá-los para alternar obscureText em um `TextField`, talvez criar um painel expansível personalizado ou talvez modificar o índice atual em um `BottomNavigationBar` enquanto altera o conteúdo do corpo em um `Scaffold`. |
573 | 591 | ||
574 | #### ValueBuilder | 592 | #### ValueBuilder |
575 | -Uma simplificação de StatefulWidget que funciona com um callback de "setState" que passa o valor atualizado. | 593 | +Uma simplificação de `StatefulWidget` que funciona com um callback de `setState` que passa o valor atualizado. |
576 | 594 | ||
577 | 595 | ||
578 | ```dart | 596 | ```dart |
@@ -583,8 +601,8 @@ ValueBuilder<bool>( | @@ -583,8 +601,8 @@ ValueBuilder<bool>( | ||
583 | onChanged: updateFn, // mesma assinatura! Você poderia usar ( newValue ) => updateFn( newValue ) | 601 | onChanged: updateFn, // mesma assinatura! Você poderia usar ( newValue ) => updateFn( newValue ) |
584 | ), | 602 | ), |
585 | // se você precisa chamar algo fora do método builder. | 603 | // se você precisa chamar algo fora do método builder. |
586 | - onUpdate: (value) => print("Value updated: $value"), | ||
587 | - onDispose: () => print("Widget unmounted"), | 604 | + onUpdate: (value) => print("Valor atualizado: $value"), |
605 | + onDispose: () => print("Widget desmontado"), | ||
588 | ), | 606 | ), |
589 | ``` | 607 | ``` |
590 | 608 | ||
@@ -602,11 +620,207 @@ ObxValue( | @@ -602,11 +620,207 @@ ObxValue( | ||
602 | ), | 620 | ), |
603 | ``` | 621 | ``` |
604 | 622 | ||
605 | -## Explicação em vídeo sobre Outras Features do GetX | ||
606 | - | 623 | +### Explicação em vídeo sobre Outras Features do GetX |
607 | 624 | ||
608 | Amateur Coder fez um vídeo incrível sobre utils, storage, bindings e outras features! Link: [GetX Other Features](https://youtu.be/ttQtlX_Q0eU) | 625 | Amateur Coder fez um vídeo incrível sobre utils, storage, bindings e outras features! Link: [GetX Other Features](https://youtu.be/ttQtlX_Q0eU) |
609 | 626 | ||
627 | + | ||
628 | +## Dicas Úteis | ||
629 | + | ||
630 | +`.obs`ervables (também conhecidos como _Rx_ Types) possuem uma grande variedade de métodos e operadores internos. | ||
631 | + | ||
632 | +> É muito comum acreditar que uma propriedade com `.obs` **É** o valor real... mas não se engane! | ||
633 | +> Evitamos a declaração de tipo da variável, porque o compilador do Dart é inteligente o suficiente e o código | ||
634 | +> parece mais limpo, mas: | ||
635 | + | ||
636 | +```dart | ||
637 | +var message = 'Hello world'.obs; | ||
638 | +print( 'Message "$message" é do tipo ${message.runtimeType}'); | ||
639 | +``` | ||
640 | + | ||
641 | +Mesmo que `message` _imprima_ o valor da string, seu tipo é **RxString**! | ||
642 | + | ||
643 | +Então, você não pode fazer `message.substring( 0, 4 )`. | ||
644 | +Você tem que acessar o `valor` real dentro do _observable_: | ||
645 | +A "maneira" mais usada é utilizando `.value`, mas, você sabia que também pode usar: | ||
646 | + | ||
647 | +```dart | ||
648 | +final name = 'GetX'.obs; | ||
649 | +// apenas "atualiza" o stream, se o valor for diferente do atual. | ||
650 | +name.value = 'Hey'; | ||
651 | + | ||
652 | +// Todas as propriedades Rx são "chamáveis" e retorna o novo valor. | ||
653 | +// mas esta abordagem não aceita `null`, a UI não será reconstruída | ||
654 | +name('Hello'); | ||
655 | + | ||
656 | +// é como um getter, imprime 'Hello' | ||
657 | +name() ; | ||
658 | + | ||
659 | +/// números: | ||
660 | + | ||
661 | +final count = 0.obs; | ||
662 | + | ||
663 | +// Você pode usar todas as operações não mutáveis de um num! | ||
664 | +count + 1; | ||
665 | + | ||
666 | +// Cuidado! isso só é válido se `count` não for final, mas var | ||
667 | +count += 1; | ||
668 | + | ||
669 | +// Você também pode comparar com os valores: | ||
670 | +count > 2; | ||
671 | + | ||
672 | +/// booleans: | ||
673 | + | ||
674 | +final flag = false.obs; | ||
675 | + | ||
676 | +// mude o valor entre true/false | ||
677 | +flag.toggle(); | ||
678 | + | ||
679 | + | ||
680 | +/// todos os tipos: | ||
681 | + | ||
682 | +// Defina `value` como null. | ||
683 | +flag.nil(); | ||
684 | + | ||
685 | +// Todas as operações toString() e toJson() são passada para `value` | ||
686 | +print( count ); // chama `toString()` de RxInt | ||
687 | + | ||
688 | +final abc = [0,1,2].obs; | ||
689 | +// Converte o valor em um Array json, imprime RxList | ||
690 | +// Json é suportado por todos os Rx types! | ||
691 | +print('json: ${jsonEncode(abc)}, type: ${abc.runtimeType}'); | ||
692 | + | ||
693 | +// RxMap, RxList e RxSet são Rx types especiais, que estendem seus tipos nativos. | ||
694 | +// mas você pode trabalhar com uma lista como uma lista normal, embora seja reativa! | ||
695 | +abc.add(12); // Coloca 12 na lista, e ATUALIZA o stream. | ||
696 | +abc[3]; // como uma lista lê o índice 3. | ||
697 | + | ||
698 | +// a igualdade funciona com o Rx e o value do observável, mas o hashCode é sempre obtido do value | ||
699 | +final number = 12.obs; | ||
700 | +print( number == 12 ); // prints > true | ||
701 | + | ||
702 | +/// Rx Models personalizados: | ||
703 | + | ||
704 | +// toJson(), toString() são transferidos para o filho, para que você possa implementar | ||
705 | +// override neles e imprimir o observável diretamente. | ||
706 | + | ||
707 | +class User { | ||
708 | + String name, last; | ||
709 | + int age; | ||
710 | + User({this.name, this.last, this.age}); | ||
711 | + | ||
712 | + @override | ||
713 | + String toString() => '$name $last, $age years old'; | ||
714 | +} | ||
715 | + | ||
716 | +final user = User(name: 'John', last: 'Doe', age: 33).obs; | ||
717 | + | ||
718 | +// `user` é "reativo", mas as propriedades dentro NÃO SÃO! | ||
719 | +// Então, se mudarmos alguma variável dentro dele: | ||
720 | +user.value.name = 'Roi'; | ||
721 | +// O widget não vai reconstruir!, | ||
722 | +// `Rx` não tem nenhuma notificação quando você muda algo dentro do usuário. | ||
723 | +// Portanto, para classes personalizadas, precisamos "notificar" manualmente a mudança. | ||
724 | +user.refresh(); | ||
725 | + | ||
726 | +// ou podemos usar o método `update()`! | ||
727 | +user.update((value){ | ||
728 | + value.name='Roi'; | ||
729 | +}); | ||
730 | + | ||
731 | +print( user ); // Resultado (toString): Roi Doe, 33 years old | ||
732 | +``` | ||
733 | + | ||
734 | +#### GetView | ||
735 | + | ||
736 | +Eu amo este Widget, é tão simples, mas tão útil! | ||
737 | + | ||
738 | +É um Widget `const Stateless` que tem um getter `controller` registrado para Controller, só isso. | ||
739 | + | ||
740 | +```dart | ||
741 | +class AwesomeController extends GetxController { | ||
742 | + final String title = 'My Awesome View'; | ||
743 | +} | ||
744 | + | ||
745 | +// SEMPRE lembre de passar o `Type` que você usou para registrar seu controlador! | ||
746 | +class AwesomeView extends GetView<AwesomeController> { | ||
747 | + @override | ||
748 | + Widget build(BuildContext context) { | ||
749 | + return Container( | ||
750 | + padding: EdgeInsets.all(20), | ||
751 | + child: Text( controller.title ), // apenas chame `controller.something` | ||
752 | + ); | ||
753 | + } | ||
754 | +} | ||
755 | +``` | ||
756 | + | ||
757 | +#### GetWidget | ||
758 | + | ||
759 | +A maioria das pessoas não tem ideia sobre este widget, ou confunde totalmente o uso dele. | ||
760 | +O caso de uso é muito raro, mas muito específico: Ele armazena em `cache` um Controller. | ||
761 | +Por causa do _cache_, não pode ser um `const Stateless`. | ||
762 | + | ||
763 | +> Então, quando você precisa armazenar em "cache" um Controller? | ||
764 | + | ||
765 | +Se você usar, uma outra característica "não tão comum" de **GetX™**: `Get.create()`. | ||
766 | + | ||
767 | +`Get.create(()=>Controller())` irá gerar um novo `Controller` cada vez que você chamar | ||
768 | +`Get.find<Controller>()`, | ||
769 | + | ||
770 | +É aí que `GetWidget` brilha... já que você pode usá-lo, por exemplo, | ||
771 | +para manter uma lista de itens Todo. Portanto, se o widget for "reconstruído", ele manterá a mesma instância do controlador. | ||
772 | + | ||
773 | +#### GetxService | ||
774 | + | ||
775 | +Esta classe é como um `GetxController`, ele compartilha o mesmo ciclo de vida ( `onInit()`, `onReady()`, `onClose()`). | ||
776 | +Mas não tem "lógica" dentro dele. Ele apenas notifica o sistema de injeção de dependência do GetX™ de que esta subclasse | ||
777 | +**não pode** ser removida da memória. | ||
778 | + | ||
779 | +Portanto, é muito útil manter seus "Services" sempre acessíveis e ativos com `Get.find()`. Como: | ||
780 | +`ApiService`, `StorageService`, `CacheService`. | ||
781 | + | ||
782 | +```dart | ||
783 | +Future<void> main() async { | ||
784 | + await initServices(); /// Aguarda a inicialização dos Services. | ||
785 | + runApp(SomeApp()); | ||
786 | +} | ||
787 | + | ||
788 | +/// É uma jogada inteligente para inicializar seus services antes de executar o aplicativo Flutter, | ||
789 | +/// já que você pode controlar o fluxo de execução (talvez você precise carregar alguma configuração de tema, | ||
790 | +/// apiKey, linguagem definida pelo usuário ... então carregue SettingService antes de executar ApiService. | ||
791 | +/// então GetMaterialApp() não precisa reconstruir e obtém os valores diretamente. | ||
792 | +void initServices() async { | ||
793 | + print('iniciando serviços...'); | ||
794 | + /// Aqui é onde você coloca a inicialização de get_storage, hive, shared_pref. | ||
795 | + /// ou checa a conexão, ou o que quer que seja assíncrono. | ||
796 | + await Get.putAsync(() => DbService().init()); | ||
797 | + await Get.putAsync(SettingsService()).init(); | ||
798 | + print('Todos os serviços iniciados.'); | ||
799 | +} | ||
800 | + | ||
801 | +class DbService extends GetxService { | ||
802 | + Future<DbService> init() async { | ||
803 | + print('$runtimeType delays 2 sec'); | ||
804 | + await 2.delay(); | ||
805 | + print('$runtimeType ready!'); | ||
806 | + return this; | ||
807 | + } | ||
808 | +} | ||
809 | + | ||
810 | +class SettingsService extends GetxService { | ||
811 | + void init() async { | ||
812 | + print('$runtimeType delays 1 sec'); | ||
813 | + await 1.delay(); | ||
814 | + print('$runtimeType ready!'); | ||
815 | + } | ||
816 | +} | ||
817 | +``` | ||
818 | + | ||
819 | +A única maneira de realmente excluir um `GetxService`, é com o `Get.reset()`, que é como uma | ||
820 | +"hot restart" do seu aplicativo. Portanto, lembre-se, se você precisar de persistência absoluta de uma instância de classe durante | ||
821 | +o ciclo de vida de seu aplicativo, use GetxService. | ||
822 | + | ||
823 | + | ||
610 | # Breaking Changes da versão 2 para 3 | 824 | # Breaking Changes da versão 2 para 3 |
611 | 825 | ||
612 | ## Tipagem Rx | 826 | ## Tipagem Rx |
@@ -618,7 +832,7 @@ Amateur Coder fez um vídeo incrível sobre utils, storage, bindings e outras fe | @@ -618,7 +832,7 @@ Amateur Coder fez um vídeo incrível sobre utils, storage, bindings e outras fe | ||
618 | | MapX | `RxMap` | | 832 | | MapX | `RxMap` | |
619 | | ListX | `RxList` | | 833 | | ListX | `RxList` | |
620 | | NumX | `RxNum` | | 834 | | NumX | `RxNum` | |
621 | -| RxDouble | `RxDouble` | | 835 | +| DoubleX | `RxDouble` | |
622 | 836 | ||
623 | ## RxController e GetBuilder se uniram | 837 | ## RxController e GetBuilder se uniram |
624 | 838 | ||
@@ -667,7 +881,7 @@ GetMaterialApp( | @@ -667,7 +881,7 @@ GetMaterialApp( | ||
667 | ) | 881 | ) |
668 | ``` | 882 | ``` |
669 | 883 | ||
670 | -### Porque essa mudança | 884 | +### Porque essa mudança? |
671 | 885 | ||
672 | Frequentemente, pode ser necessário decidir qual pagina vai ser mostrada ao usuário a partir de um parâmetro, como um token de login. A forma abordada anteriormente não era flexível, já que não permitia isso. | 886 | Frequentemente, pode ser necessário decidir qual pagina vai ser mostrada ao usuário a partir de um parâmetro, como um token de login. A forma abordada anteriormente não era flexível, já que não permitia isso. |
673 | 887 | ||
@@ -686,13 +900,49 @@ GetMaterialApp( | @@ -686,13 +900,49 @@ GetMaterialApp( | ||
686 | ) | 900 | ) |
687 | ``` | 901 | ``` |
688 | 902 | ||
689 | -# Por que GetX? | 903 | +# Por que GetX™? |
690 | 904 | ||
691 | 1- Muitas vezes após uma atualização do Flutter, muitos dos seus packages irão quebrar. As vezes acontecem erros de compilação, muitas vezes aparecem erros que ainda não existem respostas sobre e o desenvolvedor necessita saber de onde o erro veio, rastreá-lo, para só então tentar abrir uma issue no repositório correspondente e ver seu problema resolvido. Get centraliza os principais recursos para o desenvolvimento (Gerência de estado, de dependências e de rotas), permitindo você adicionar um único package em seu pubspec e começar a trabalhar. Após uma atualização do Flutter, a única coisa que você precisa fazer é atualizar a dependencia do Get e começar a trabalhar. Get também resolve problemas de compatibilidade. Quantas vezes uma versão de um package não é compatível com a versão de outro, porque um utiliza uma dependência em uma versão e o outro em outra versão? Essa também não é uma preocupação usando Get, já que tudo está no mesmo package e é totalmente compatível. | 905 | 1- Muitas vezes após uma atualização do Flutter, muitos dos seus packages irão quebrar. As vezes acontecem erros de compilação, muitas vezes aparecem erros que ainda não existem respostas sobre e o desenvolvedor necessita saber de onde o erro veio, rastreá-lo, para só então tentar abrir uma issue no repositório correspondente e ver seu problema resolvido. Get centraliza os principais recursos para o desenvolvimento (Gerência de estado, de dependências e de rotas), permitindo você adicionar um único package em seu pubspec e começar a trabalhar. Após uma atualização do Flutter, a única coisa que você precisa fazer é atualizar a dependencia do Get e começar a trabalhar. Get também resolve problemas de compatibilidade. Quantas vezes uma versão de um package não é compatível com a versão de outro, porque um utiliza uma dependência em uma versão e o outro em outra versão? Essa também não é uma preocupação usando Get, já que tudo está no mesmo package e é totalmente compatível. |
692 | 906 | ||
693 | -2- Flutter é fácil, Flutter é incrível, mas Flutter ainda tem algum boilerplate que pode ser indesejado para maioria dos desenvolvedores, como o Navigator.of(context).push(context, builder[...]. Get simplifica o desenvolvimento. Em vez de escrever 8 linhas de código para apenas chamar uma rota, você pode simplesmente fazer: Get.to(Home()) e pronto, você irá para a próxima página. Urls dinâmicas da web é algo realmente doloroso de fazer com o Flutter atualmente e isso com o GetX é estupidamente simples. Gerenciar estados no Flutter e gerenciar dependências também é algo que gera muita discussão, por haver centenas de padrões na pub. Mas não há nada que seja tão fácil quanto adicionar um ".obs" no final de sua variável, colocar o seu widget dentro de um Obx e pronto, todas atualizações daquela variável serão automaticamente atualizadas na tela. | 907 | +2- Flutter é fácil, Flutter é incrível, mas Flutter ainda tem algum boilerplate que pode ser indesejado para maioria dos desenvolvedores, como o Navigator.of(context).push(context, builder[...]. Get simplifica o desenvolvimento. Em vez de escrever 8 linhas de código para apenas chamar uma rota, você pode simplesmente fazer: Get.to(Home()) e pronto, você irá para a próxima página. Urls dinâmicas da web é algo realmente doloroso de fazer com o Flutter atualmente e isso com o GetX™ é estupidamente simples. Gerenciar estados no Flutter e gerenciar dependências também é algo que gera muita discussão, por haver centenas de padrões na pub. Mas não há nada que seja tão fácil quanto adicionar um ".obs" no final de sua variável, colocar o seu widget dentro de um Obx e pronto, todas atualizações daquela variável serão automaticamente atualizadas na tela. |
694 | 908 | ||
695 | -3- Facilidade sem se preocupar com desempenho. O desempenho do Flutter já é incrível, mas imagine que você use um gerenciador de estados e um locator para distribuir suas classes blocs/stores/controllers/ etc. Você deverá chamar manualmente a exclusão daquela dependência quando não precisar dela. Mas já pensou em simplesmente usar seu controlador e quando ele não tivesse mais sendo usado por ninguém, ele simplesmente fosse excluído da memória? É isso que GetX faz. Com o SmartManagement, tudo que não está sendo usado é excluído da memória e você não deve se preocupar em nada além de programar. Você terá garantia que está consumindo o mínimo de recursos necessários, sem ao menos ter criado uma lógica para isso. | 909 | +3- Facilidade sem se preocupar com desempenho. O desempenho do Flutter já é incrível, mas imagine que você use um gerenciador de estados e um locator para distribuir suas classes blocs/stores/controllers/ etc. Você deverá chamar manualmente a exclusão daquela dependência quando não precisar dela. Mas já pensou em simplesmente usar seu controlador e quando ele não tivesse mais sendo usado por ninguém, ele simplesmente fosse excluído da memória? É isso que GetX™ faz. Com o SmartManagement, tudo que não está sendo usado é excluído da memória e você não deve se preocupar em nada além de programar. Você terá garantia que está consumindo o mínimo de recursos necessários, sem ao menos ter criado uma lógica para isso. |
696 | 910 | ||
697 | 4- Desacoplamento real. Você já deve ter ouvido o conceito "separar a view da lógica de negócios". Isso não é uma peculiaridade do BLoC, MVC ou MVVM, qualquer outro padrão existente no mercado tem esse conceito. No entanto, muitas vezes esse conceito pode ser mitigado no Flutter por conta do uso do context. | 911 | 4- Desacoplamento real. Você já deve ter ouvido o conceito "separar a view da lógica de negócios". Isso não é uma peculiaridade do BLoC, MVC ou MVVM, qualquer outro padrão existente no mercado tem esse conceito. No entanto, muitas vezes esse conceito pode ser mitigado no Flutter por conta do uso do context. |
698 | -Se você precisa de context para localizar um InheritedWidget, você precisa disso na view ou passar o context por parâmetro. Eu particularmente acho essa solução muito feia e para trabalhar em equipes teremos sempre uma dependência da lógica de negócios da View. Getx é pouco ortodoxo com a abordagem padrão e apesar de não proibir totalmente o uso de StatefulWidgets, InitState e etc, ele tem sempre uma abordagem similar que pode ser mais limpa. Os controllers tem ciclos de vida e quando você precisa fazer uma solicitação APIREST por exemplo, você não depende de nada da view. Você pode usar onInit para iniciar a chamada http e quando os dados chegarem, as variáveis serão preenchidas. Como GetX é totalmente reativo (de verdade e trabalha sob streams), assim que os itens forem preenchidos, automaticamente será atualizado na view todos os widgets que usam aquela variável. Isso permite que as pessoas especialistas em UI trabalhem apenas com widgets e não precisem enviar nada para a lógica de negócio além de eventos do usuário (como clicar em um botão), enquanto as pessoas que trabalham com a lógica de negócio ficarão livres para criá-la e testá-la separadamente. | 912 | +Se você precisa de context para localizar um InheritedWidget, você precisa disso na view ou passar o context por parâmetro. Eu particularmente acho essa solução muito feia e para trabalhar em equipes teremos sempre uma dependência da lógica de negócios da View. GetX™ é pouco ortodoxo com a abordagem padrão e apesar de não proibir totalmente o uso de StatefulWidgets, InitState e etc, ele tem sempre uma abordagem similar que pode ser mais limpa. Os controllers tem ciclos de vida e quando você precisa fazer uma solicitação APIREST por exemplo, você não depende de nada da view. Você pode usar onInit para iniciar a chamada http e quando os dados chegarem, as variáveis serão preenchidas. Como GetX™ é totalmente reativo (de verdade e trabalha sob streams), assim que os itens forem preenchidos, automaticamente será atualizado na view todos os widgets que usam aquela variável. Isso permite que as pessoas especialistas em UI trabalhem apenas com widgets e não precisem enviar nada para a lógica de negócio além de eventos do usuário (como clicar em um botão), enquanto as pessoas que trabalham com a lógica de negócio ficarão livres para criá-la e testá-la separadamente. |
913 | + | ||
914 | +# Comunidade | ||
915 | + | ||
916 | +## Canais da comunidade | ||
917 | + | ||
918 | +GetX™ tem uma comunidade altamente ativa e útil. Se você tiver dúvidas, ou quiser alguma ajuda com relação ao uso deste framework, por favor entre em nossos canais da comunidade, sua dúvida será respondida mais rapidamente, e será o lugar mais adequado. Este repositório é exclusivo para abertura de issues e solicitação de recursos, mas fique à vontade para fazer parte da Comunidade GetX™. | ||
919 | + | ||
920 | +| **Slack (Inglês)** | **Discord (Inglês e Português)** | **Telegram (Português)** | | ||
921 | +| :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------- | | ||
922 | +| [](https://communityinviter.com/apps/getxworkspace/getx) | [](https://discord.com/invite/9Hpt99N) | [](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) | | ||
923 | + | ||
924 | +## Como contribuir | ||
925 | + | ||
926 | +_Quer contribuir com o projeto? Teremos o orgulho de destacá-lo como um de nossos colaboradores. Aqui estão alguns pontos onde você pode contribuir e tornar o Get (e Flutter) ainda melhor._ | ||
927 | + | ||
928 | +- Ajudando a traduzir o readme para outros idiomas. | ||
929 | +- Adicionando documentação ao readme (muitas funções do Get ainda não foram documentadas). | ||
930 | +- Escreva artigos ou faça vídeos ensinando como usar o Get (eles serão inseridos no Readme e futuramente em nosso Wiki). | ||
931 | +- Fazendo PRs para código/testes. | ||
932 | +- Incluindo novas funções. | ||
933 | + | ||
934 | +Qualquer contribuição é bem-vinda! | ||
935 | + | ||
936 | + | ||
937 | +## Artigos e vídeos | ||
938 | + | ||
939 | +- [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). (inglês) | ||
940 | +- [Complete GetX™ Navigation](https://www.youtube.com/watch?v=RaqPIoJSTtI) - Route management video by Amateur Coder. (inglês) | ||
941 | +- [Complete GetX™ State Management](https://www.youtube.com/watch?v=CNpXbeI_slw) - State management video by Amateur Coder. (inglês) | ||
942 | +- [GetX™ Other Features](https://youtu.be/ttQtlX_Q0eU) - Utils, storage, bindings and other features video by Amateur Coder. (inglês) | ||
943 | +- [Firestore User with GetX™ | Todo App](https://www.youtube.com/watch?v=BiV0DcXgk58) - Video by Amateur Coder. (inglês) | ||
944 | +- [Firebase Auth with GetX™ | Todo App](https://www.youtube.com/watch?v=-H-T_BSgfOE) - Video by Amateur Coder. (inglês) | ||
945 | +- [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). (inglês) | ||
946 | +- [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. (inglês) | ||
947 | +- [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. (inglês) | ||
948 | +- [GetX™ Flutter Firebase Auth Example](https://medium.com/@jeffmcmorris/getx-flutter-firebase-auth-example-b383c1dd1de2) - Article by Jeff McMorris. (inglês) |
-
Please register or login to post a comment