Jonny Borges
Committed by GitHub

Merge pull request #892 from eduardoflorence/add-getconnect-doc-ptbr

Improve-doc-pt-br
1 ![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) 1 ![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png)
2 2
3 -*Idiomas: [Inglês](README.md), [Urdu](README.ur-PK.md), [Chinês](README.zh-cn.md), Português Brasileiro (este arquivo), [Espanhol](README-es.md), [Russo](README.ru.md), [Polonês](README.pl.md), [Coreana](README.ko-kr.md).* 3 +**Idiomas: [Inglês](README.md), [Urdu](README.ur-PK.md), [Chinês](README.zh-cn.md), Português Brasileiro (este arquivo), [Espanhol](README-es.md), [Russo](README.ru.md), [Polonês](README.pl.md), [Coreana](README.ko-kr.md).**
4 4
5 [![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get) 5 [![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get)
  6 +[![likes](https://badges.bar/get/likes)](https://pub.dev/packages/get/score)
6 ![building](https://github.com/jonataslaw/get/workflows/build/badge.svg) 7 ![building](https://github.com/jonataslaw/get/workflows/build/badge.svg)
7 [![style: effective dart](https://img.shields.io/badge/style-effective_dart-40c4ff.svg)](https://pub.dev/packages/effective_dart) 8 [![style: effective dart](https://img.shields.io/badge/style-effective_dart-40c4ff.svg)](https://pub.dev/packages/effective_dart)
8 [![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) 9 [![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N)
@@ -39,6 +40,17 @@ @@ -39,6 +40,17 @@
39 - [Alterar local](#alterar-local) 40 - [Alterar local](#alterar-local)
40 - [Localidade do sistema operacional](#localidade-do-sistema-operacional) 41 - [Localidade do sistema operacional](#localidade-do-sistema-operacional)
41 - [Mudar tema (changeTheme)](#mudar-tema-changetheme) 42 - [Mudar tema (changeTheme)](#mudar-tema-changetheme)
  43 + - [GetConnect](#getconnect)
  44 + - [Configuração Padrão](#configuração-padrão)
  45 + - [Configuração Personalizada](#configuração-personalizada)
  46 + - [GetPage Middleware](#getpage-middleware)
  47 + - [Priority](#priority)
  48 + - [Redirect](#redirect)
  49 + - [onPageCalled](#onpagecalled)
  50 + - [OnBindingsStart](#onbindingsstart)
  51 + - [OnPageBuildStart](#onpagebuildstart)
  52 + - [OnPageBuilt](#onpagebuilt)
  53 + - [OnPageDispose](#onpagedispose)
42 - [Outras APIs avançadas](#outras-apis-avançadas) 54 - [Outras APIs avançadas](#outras-apis-avançadas)
43 - [Configurações Globais opcionais e configurações manuais](#configurações-globais-opcionais-e-configurações-manuais) 55 - [Configurações Globais opcionais e configurações manuais](#configurações-globais-opcionais-e-configurações-manuais)
44 - [Widgets de Estado Local](#widgets-de-estado-local) 56 - [Widgets de Estado Local](#widgets-de-estado-local)
@@ -63,17 +75,27 @@ @@ -63,17 +75,27 @@
63 # Sobre Get 75 # Sobre Get
64 76
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. 77 - 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.
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. 78 +
  79 +- GetX™ possui 3 princípios básicos, o que significa que esta é a prioridade para todos os recursos da biblioteca: **PRODUTIVIDADE, PERFORMANCE AND ORGANIZAÇÃO.**
  80 +
  81 + - **PERFOMANCE**: GetX™ é focado em desempenho e consumo mínimo de recursos. GetX não usa Streams ou ChangeNotifier.
  82 +
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. 83 - **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.  
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.  
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)**. 84 + Geralmente, o desenvolvedor deve se preocupar em remover os controladores da memória. Com GetX™, isso não é necessário porque, por padrão, os recursos são removidos da memória quando não são usados. Se quiser mantê-lo na memória, você deve declarar explicitamente "permanent: true" em sua dependência. Dessa forma, além de economizar tempo, você corre menos risco de ter dependências desnecessárias na memória. O carregamento da dependência também é lazy por padrão.
  85 +
  86 + - **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.
  87 + 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, em algo totalmente possível.
  88 + 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.
  89 + 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.
  90 +
  91 +- 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.
73 92
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)**. 93 +- GetX™ possui um enorme ecossistema, uma grande comunidade, um grande número de colaboradores e será mantido enquanto o Flutter existir. Getx também é capaz de rodar com o mesmo código no Android, iOS, Web, Mac, Linux, Windows e em seu servidor.
  94 +**É possível reutilizar totalmente seu código feito no frontend em seu backend com [Get Server](https://github.com/jonataslaw/get_server)**.
75 95
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)** 96 +**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)**.
  97 +
  98 +**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)**
77 99
78 # Instalando 100 # Instalando
79 101
@@ -167,13 +189,7 @@ Melhore seus prazos, entregue tudo a tempo sem perder performance. Get não é p @@ -167,13 +189,7 @@ Melhore seus prazos, entregue tudo a tempo sem perder performance. Get não é p
167 189
168 ## Gerenciamento de estado 190 ## Gerenciamento de estado
169 191
170 -Há atualmente vários gerenciadores de estados para o Flutter. Porém, a maioria deles envolve usar `ChangeNotifier` para atualizar os widgets e isso é uma abordagem muito ruim no quesito performance em aplicações de médio ou grande porte. Você pode checar na documentação oficial do Flutter que o [`ChangeNotifier` deveria ser usado com um ou no máximo dois listeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html), fazendo-o praticamente inutilizável em qualquer aplicação média ou grande.  
171 -  
172 -Get não é melhor ou pior que nenhum gerenciador de estado, mas você deveria analisar esses pontos tanto quanto os argumentos abaixo para escolher entre usar Get na sua forma pura, ou usando-o em conjunto com outro gerenciador de estado.  
173 -  
174 -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.  
175 -  
176 -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) 192 +GetX™ posuui dois gerenciadores de estado diferentes: o gerenciador de estado simples (vamos chamá-lo de GetBuilder) e o gerenciador de estado reativo (GetX/Obx)
177 193
178 ### Reactive state manager 194 ### Reactive state manager
179 195
@@ -183,6 +199,7 @@ Programação reativa pode alienar muitas pessoas porque é dito que é complica @@ -183,6 +199,7 @@ Programação reativa pode alienar muitas pessoas porque é dito que é complica
183 * Você não precisa criar um StreamBuilder para cada variável 199 * Você não precisa criar um StreamBuilder para cada variável
184 * Você não precisa criar uma classe para cada estado 200 * Você não precisa criar uma classe para cada estado
185 * Você não precisa criar um get para o valor inicial 201 * Você não precisa criar um get para o valor inicial
  202 +* Você não precisará usar geradores de código
186 203
187 Programação reativa com o Get é tão fácil quanto usar setState. 204 Programação reativa com o Get é tão fácil quanto usar setState.
188 205
@@ -369,12 +386,12 @@ Get.updateLocale(locale); @@ -369,12 +386,12 @@ Get.updateLocale(locale);
369 ``` 386 ```
370 387
371 #### Localidade do sistema operacional 388 #### Localidade do sistema operacional
372 -Para ler a localidade do sistema operacional, você pode usar `window.locale`. 389 +Para ler a localidade do sistema operacional, você pode usar `Get.deviceLocale`.
373 ```dart 390 ```dart
374 import 'dart:ui' as ui; 391 import 'dart:ui' as ui;
375 392
376 return GetMaterialApp( 393 return GetMaterialApp(
377 - locale: ui.window.locale, 394 + locale: Get.deviceLocale,
378 ); 395 );
379 ``` 396 ```
380 397
@@ -402,6 +419,159 @@ Se você quiser saber mais como trocar o tema, você pode seguir esse tutorial n @@ -402,6 +419,159 @@ Se você quiser saber mais como trocar o tema, você pode seguir esse tutorial n
402 419
403 - [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). 420 - [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).
404 421
  422 +
  423 +## GetConnect
  424 +GetConnect é uma maneira fácil de se comunicar de trás para a frente com http ou websockets
  425 +
  426 +### Configuração Padrão
  427 +Você pode simplesmente estender GetConnect e usar os métodos GET/POST/PUT/DELETE/SOCKET para se comunicar com sua API Rest ou websockets.
  428 +
  429 +```dart
  430 +class UserProvider extends GetConnect {
  431 + // Requisição Get
  432 + Future<Response> getUser(int id) => get('http://youapi/users/$id');
  433 + // Requisição Post
  434 + Future<Response> postUser(Map data) => post('http://youapi/users', body: data);
  435 + // Requisição Post com Arquivo
  436 + Future<Response<CasesModel>> postCases(List<int> image) {
  437 + final form = FormData({
  438 + 'file': MultipartFile(image, filename: 'avatar.png'),
  439 + 'otherFile': MultipartFile(image, filename: 'cover.png'),
  440 + });
  441 + return post('http://youapi/users/upload', form);
  442 + }
  443 +
  444 + GetSocket userMessages() {
  445 + return socket('https://yourapi/users/socket');
  446 + }
  447 +}
  448 +```
  449 +### Configuração Personalizada
  450 +GetConnect é altamente personalizável, você pode definir uma base Url, modificadores de resposta, modificadores de Requests, definir um autenticador e até o número de tentativas em que tentará se autenticar, além de dar a possibilidade de definir um decodificador padrão que irá transformar todas as suas solicitações em seus modelos sem qualquer configuração adicional.
  451 +
  452 +```dart
  453 +class HomeProvider extends GetConnect {
  454 + @override
  455 + void onInit() {
  456 + // Todas as requisições passam por jsonEncode e então por CasesModel.fromJson()
  457 + httpClient.defaultDecoder = CasesModel.fromJson;
  458 + httpClient.baseUrl = 'https://api.covid19api.com';
  459 + // baseUrl = 'https://api.covid19api.com'; // Define baseUrl para
  460 + // Http e websockets se usado sem uma instância [httpClient]
  461 +
  462 + // Anexa a propriedade 'apikey' no cabeçalho de todas as requisições
  463 + httpClient.addRequestModifier((request) {
  464 + request.headers['apikey'] = '12345678';
  465 + return request;
  466 + });
  467 +
  468 + // Mesmo que o servidor envie dados do país "Brasil",
  469 + // eles nunca serão exibidos para os usuários, porque você removeu
  470 + // os dados da resposta, mesmo antes de a resposta ser entregue
  471 + httpClient.addResponseModifier<CasesModel>((request, response) {
  472 + CasesModel model = response.body;
  473 + if (model.countries.contains('Brazil')) {
  474 + model.countries.remove('Brazil');
  475 + }
  476 + });
  477 +
  478 + httpClient.addAuthenticator((request) async {
  479 + final response = await get("http://yourapi/token");
  480 + final token = response.body['token'];
  481 + // Configurando um cabeçalho
  482 + request.headers['Authorization'] = "$token";
  483 + return request;
  484 + });
  485 +
  486 + // O autenticador será chamado 3 vezes se HttpStatus for
  487 + // HttpStatus.unauthorized
  488 + httpClient.maxAuthRetries = 3;
  489 + }
  490 + }
  491 +
  492 + @override
  493 + Future<Response<CasesModel>> getCases(String path) => get(path);
  494 +}
  495 +```
  496 +
  497 +## GetPage Middleware
  498 +
  499 +O GetPage agora tem uma nova propriedade que recebe uma lista de GetMiddleWare e executa cada item na ordem específica.
  500 +
  501 +**Nota**: Quando GetPage tem Middlewares, todos os filhos desta página terão os mesmos middlewares automaticamente.
  502 +
  503 +### Priority
  504 +
  505 +A ordem dos middlewares a serem executados pode ser definida pela prioridade no GetMiddleware.
  506 +
  507 +```dart
  508 +final middlewares = [
  509 + GetMiddleware(priority: 2),
  510 + GetMiddleware(priority: 5),
  511 + GetMiddleware(priority: 4),
  512 + GetMiddleware(priority: -8),
  513 +];
  514 +```
  515 +Esses middlewares serão executados nesta ordem: **-8 => 2 => 4 => 5**
  516 +
  517 +### Redirect
  518 +
  519 +Esta função será chamada quando a página da rota chamada estiver sendo pesquisada. RouteSettings se torna o resultado do redirecionamento. Ou retorne nulo e não haverá redirecionamento.
  520 +
  521 +```dart
  522 +GetPage redirect( ) {
  523 + final authService = Get.find<AuthService>();
  524 + return authService.authed.value ? null : RouteSettings(name: '/login')
  525 +}
  526 +```
  527 +
  528 +### onPageCalled
  529 +
  530 +Esta função será chamada quando uma página for chamada, antes de qualquer coisa ser criada e
  531 +você pode usá-la para mudar algo sobre a página ou dar-lhe uma nova página
  532 +
  533 +```dart
  534 +GetPage onPageCalled(GetPage page) {
  535 + final authService = Get.find<AuthService>();
  536 + return page.copyWith(title: 'Welcome ${authService.UserName}');
  537 +}
  538 +```
  539 +
  540 +### OnBindingsStart
  541 +
  542 +Esta função será chamada logo antes da inicialização dos Bindings.
  543 +Aqui você pode alterar as ligações desta página.
  544 +
  545 +```dart
  546 +List<Bindings> onBindingsStart(List<Bindings> bindings) {
  547 + final authService = Get.find<AuthService>();
  548 + if (authService.isAdmin) {
  549 + bindings.add(AdminBinding());
  550 + }
  551 + return bindings;
  552 +}
  553 +```
  554 +
  555 +### OnPageBuildStart
  556 +
  557 +Esta função será chamada logo após a inicialização dos Bindings.
  558 +Aqui você pode fazer algo depois de criar as ligações e antes de criar o widget da página.
  559 +
  560 +```dart
  561 +GetPageBuilder onPageBuildStart(GetPageBuilder page) {
  562 + print('bindings are ready');
  563 + return page;
  564 +}
  565 +```
  566 +
  567 +### OnPageBuilt
  568 +
  569 +Esta função será chamada logo após a função GetPage.page ser chamada e fornecerá o resultado da função e obtém o widget que será mostrado.
  570 +
  571 +### OnPageDispose
  572 +
  573 +Esta função será chamada logo após descartar todos os objetos relacionados (controladores, visualizações, ...) da página.
  574 +
405 ## Outras APIs avançadas 575 ## Outras APIs avançadas
406 576
407 ```dart 577 ```dart
@@ -757,7 +927,7 @@ class AwesomeView extends GetView<AwesomeController> { @@ -757,7 +927,7 @@ class AwesomeView extends GetView<AwesomeController> {
757 Widget build(BuildContext context) { 927 Widget build(BuildContext context) {
758 return Container( 928 return Container(
759 padding: EdgeInsets.all(20), 929 padding: EdgeInsets.all(20),
760 - child: Text( controller.title ), // apenas chame `controller.something` 930 + child: Text(controller.title ), // apenas chame `controller.something`
761 ); 931 );
762 } 932 }
763 } 933 }